【发布时间】:2014-04-10 13:49:37
【问题描述】:
我正在使用 strtok() 来解析从 fgets() 得到的字符串,该字符串由 ~ 字符分隔
例如数据_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')。为什么会出现这种情况?
【问题讨论】:
-
您能创建一个Minimal, Complete, and Verifiable example 并展示给我们看吗?
-
尝试打印字符的值,而不是其外观:
printf("%d-%d\n", ch, index); -
我认为打印 10 是因为换行(Ascii 值 = 10)因为
pch = strtok(NULL, " ~\n");像pch = strtok(NULL, "~");这样写然后我认为它会没事的。 -
如果我继续分解字符串(以后不重新使用它),复制它不是没有意义吗?通过在 NULL 上调用 strtok,我应该能够继续分解它。
-
让我猜猜,您在 Windows 系统上编辑了文件(换行符是
"\r\n"),然后在换行符只是普通换行符的系统或环境中运行程序。跨度>