我正在使用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')。为什么会这样?
答案 0 :(得分:2)
根据您的修改,输入行以\r\n
结尾。作为解决方法,您只需将\r
添加到strtok中的令牌列表中。
但是,这应该进一步调查。 \r\n
是以Windows文件结尾的行,但stdin
是文本流,因此文件中的\r\n
将转换为\n
fgets
结果。
您是否可能在包含\r\r\n
之类奇怪内容的文件中进行管道传输?尝试使用十六进制转储您正在输入的文件来检查它。
另一种可能的解释可能是您的Cygwin(或其他)环境以某种方式配置为不转换通过管道输入的文件中的行结尾。
编辑:Joachim的建议更有可能 - 在非Windows系统上使用\r\n
文件。如果是这种情况,您可以通过在文件上运行dos2unix
来修复它。但是按照“接受所有内容,正确生成”的原则,您的程序处理此文件将非常有用。