尝试validation新行删除后,新行删除无效

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

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子句后,不再删除换行符! 我究竟做错了什么? 来自整个代码的Snippit:

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

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

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

 #include  /* 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; } 

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

 #include  ... 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 
 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’和’\ n’; srcspn()片段从他们遇到的第一个 ‘\ r’或’\ n’中删除所有内容。