【问题标题】:strtok() appends some character to my stringstrtok() 将一些字符附加到我的字符串
【发布时间】: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"),然后在换行符只是普通换行符的系统或环境中运行程序。跨度>

标签: c string strtok


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的解释!
猜你喜欢
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2012-10-04
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多