strtok()在我的字符串中附加一些字符

时间:2014-04-10 13:49:38

标签: c string strtok

我正在使用strtok()来解析我从fgets()得到的字符串,该字符串由〜字符

分隔

e.g。 _1〜_2

以下是我的代码示例:

fgets(buff, LINELEN, stdin);
pch = strtok(buff, " ~\n");
//do stuff
pch = strtok(NULL, " ~\n");
//do stuff

strtok的第一个实例将它分开很好,我按原样得到data_1,并且strlen(data_1)提供了正确的长度。但是,strtok的第二个实例返回字符串,并附加了一些内容。

输入andrewjohn ~ jamessmith后,我打印出每个字符和索引,我得到了这个输出:

a0
n1
d2
r3
e4
w5
j6
o7
h8
n9

j0
a1
m2
e3
s4
s5
m6
i7
t8
h9
10

“11th”值对应的是什么?

编辑:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char buff[100];
    char * pch;
    fgets(buff, 100, stdin);
    pch = strtok(buff, " ~\n");
    printf("FIRST NAME\n");
    for(i = 0; i < strlen(pch); i++)
    {
        printf("%c %d %d\n", *(pch+i), *(pch+i), i);
    }
    printf("SECOND NAME\n");
    pch = strtok(NULL, " ~\n");
    for(i = 0; i < strlen(pch); i++)
    {
        printf("%c %d %d\n", *(pch+i), *(pch+i), i);
    }
}

我通过以下方式运行:

cat sample.in | ./myfile

sample.in有

的地方
andrewjohn ~ johnsmith

输出是: FIRST NAME a 97 0 n 110 1 d 100 2 r 114 3 e 101 4 w 119 5 j 106 6 o 111 7 h 104 8 n 110 9 SECOND NAME j 106 0 o 111 1 h 104 2 n 110 3 s 115 4 m 109 5 i 105 6 t 116 7 h 104 8 13 9

所以最后一个字符是ASCII值13,表示它是一个回车符('\ r')。为什么会这样?

1 个答案:

答案 0 :(得分:2)

根据您的修改,输入行以\r\n结尾。作为解决方法,您只需将\r添加到strtok中的令牌列表中。

但是,这应该进一步调查。 \r\n是以Windows文件结尾的行,但stdin是文本流,因此文件中的\r\n将转换为\n fgets结果。

您是否可能在包含\r\r\n之类奇怪内容的文件中进行管道传输?尝试使用十六进制转储您正在输入的文件来检查它。

另一种可能的解释可能是您的Cygwin(或其他)环境以某种方式配置为不转换通过管道输入的文件中的行结尾。

编辑:Joachim的建议更有可能 - 在非Windows系统上使用\r\n文件。如果是这种情况,您可以通过在文件上运行dos2unix来修复它。但是按照“接受所有内容,正确生成”的原则,您的程序处理此文件将非常有用。