c-在尝试验证换行符是否存在后,换行符删除不起作用



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

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

它是-2,因为最后一个元素是。这么多有效。然而,输入数据的最后一个元素没有换行符,所以只使用换行符最终会从最后一个输入集中删除倒数第二个字符。

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

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

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

但是,添加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] ='';
            fwrite("        <SPC>", 13, 1, fw);
            fwrite(token, strlen(token), 1, fw);
            fwrite("</SPC>n", 7, 1, fw);
            fwrite("    </item>n", 12, 1, fw);
        }
    }

您的换行符应该位于line[strlen(line)-1],但您可以在Windows下工作,其中换行符实际上由回车符和换行符组成。这可以解释为什么line[strlen(line)-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;
} 

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

#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, "nr");

该解决方案涵盖*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, "rn" );
token[len] = 0;

或者,作为一句话:

token [ token + strcspn(token, "rn" )] = 0;

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

最新更新