C 尝试验证新行是否存在后,新行删除不起作用

C 尝试验证新行是否存在后,新行删除不起作用,c,arrays,string,newline,C,Arrays,String,Newline,我正在编写一个代码来解析一些输入数据,并将其以特殊格式写入文件。我正在从每个字符串标记中删除换行符,如下所示: token[strlen(token)-2] ='\0' 它是-2,因为最后一个元素是\0。这很管用。但是,输入数据的最后一个元素没有换行符,因此仅使用换行符最终会从最后一个输入集中删除倒数第二个字符 original input: 0.38 after running it through the removal: 0.3 显而易见的解决方案是在删除之前检查换行符是否存在。我这样

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

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);
        }
    }
while((token=strep(&line,“,”)!=NULL){
如果(x++==1){
写入(“\n”,11,1,fw);
fwrite(“”,14,1,fw);
fwrite(令牌,strlen(令牌),1,fw);
写入(“\n”,8,1,fw);
}
else if(isdigit(令牌[0])){
如果(令牌[strlen(令牌)-2]=='\n')令牌[strlen(令牌)-2]='\0';
fwrite(“”,13,1,fw);
fwrite(令牌,strlen(令牌),1,fw);
写入(“\n”,7,1,fw);
写入(“\n”,12,1,fw);
}
}

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

我认为您的问题是使用
-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;
} 
#包括
/*删除右侧的空白*/
void rtrim(字符*s){
char*p;
对于(p=s+strlen(s)-1;p>=s&&isspace(p[0]);p--);
p[1]=0;
} 
或者,您可以使用strcspn():

或者,作为一个班轮:

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

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

为了灵活性(无字符计数,无字符文本),我会:


乍一看问题是什么并不明显。也许您应该只使用
char*p=strchr(标记“\n”);如果(p)*p=0?使用循环:
for(len=strlen(token);len&&token[len-1]='\n';len--){token[len]=0;}
注意:这也可以扩展为缓存'\r'。在这种情况下,您应该添加这一点,OP应该在
strlen(token)-2检查
\r>\r>而不是
\n
,我使用了
-1
,但它没有删除任何换行符;当我个人使用
-2
时,我会检查
\r
\n
并确保字符串足够长,可以同时包含这两个字符串。@elder4222但在Linux系统上会出现问题。如果您需要类似可移植性的东西,请从末尾检查
\r
\n
中的任何一种。
size_t len;
len = strcspn(token, "\r\n" );
token[len] = 0;
token [ token + strcspn(token, "\r\n" )] = 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, "\n\r");
#define char wchar_t