2

我正在编写代码来解析一些输入数据并将其以特殊格式写入文件。我正在从每个字符串标记中删除一个换行符,如下所示:

token[strlen(token)-2] ='\0'

这是-2因为最后一个元素是\0. 这很管用。但是,输入数据的最后一个元素没有换行符,因此仅使用它最终会从最后一个输入集中删除倒数第二个字符。

original input: 0.38
after running it through the removal: 0.3

显而易见的解决方案是在删除之前检查换行符是否存在。我这样做:

if(token[strlen(token)-2] =='\n') token[strlen(token)-2] ='\0';

但是,添加 if 子句后,换行符不再删除!我究竟做错了什么?整个代码的片段:

    while((token = strsep(&line, ",")) != NULL){
        if(x++ == 1){
            fwrite("    <item>\n", 11, 1, fw);
            fwrite("        <name>", 14, 1, fw);
            fwrite(token, strlen(token), 1, fw);
            fwrite("</name>\n", 8, 1, fw);
        }
        else if(isdigit(token[0])) {
            if(token[strlen(token)-2] =='\n') token[strlen(token)-2] ='\0';
            fwrite("        <SPC>", 13, 1, fw);
            fwrite(token, strlen(token), 1, fw);
            fwrite("</SPC>\n", 7, 1, fw);
            fwrite("    </item>\n", 12, 1, fw);
        }
    }
4

4 回答 4

2

您的换行符应该是 at line[strlen(line)-1],但您可以在 Windows 下工作,其中换行符实际上由一个回车符和一个换行符组成。这可以解释为什么line[strlen(line)-2]='\0'成功删除行尾,但测试失败。

于 2013-04-14T15:14:37.737 回答
2

我认为您的问题是使用-2而不是-1,使用此函数从字符串的右侧删除空格:

#include <ctype.h> 
/* remove whitespace from the right */ 
void rtrim(char *s) {
    char *p;
    for (p = s + strlen(s) - 1; p >= s && isspace(p[0]); p--);
    p[1] = 0;
} 
于 2013-04-14T15:16:36.810 回答
2

为了灵活性(没有字符计数,没有字符文字),我会这样做:

#include <string.h>

...

char * rtrim(char * str, const char * del)
{
  if (str)
  {
    char * pc;
    while (pc = strpbrk(str, del))
    {
      *pc = 0;
    }
  }

  return str;
}

...

char * line;

... /* let line point to some string */

/* to remove any kind of line end, call it like this: */
line = rtrim(line, "\n\r");

此解决方案涵盖 *IX、ms 和 mac 行结束,并且还可以在以下情况下生存:

#define char wchar_t
于 2013-04-14T15:29:53.280 回答
2
size_t len;
for(len=strlen(token); len && (token[len-1] == '\r' || token[len-1] == '\n'); len--) {
   token[len] = 0;
   }

或者,您可以使用 strcspn():

size_t len;
len = strcspn(token, "\r\n" );
token[len] = 0;

或者,作为单行:

token [ token + strcspn(token, "\r\n" )] = 0;

请注意,第一个片段仅删除尾随的 '\r's 和 '\n's; srcspn() 片段从他们遇到的第一个'\r' 或 '\n' 中删除所有内容。

于 2013-04-14T15:19:07.413 回答