C strtok分离器返回→(结束时

时间:2012-10-30 18:05:11

标签: c strtok

我已经编写了一个程序,我想输入例如“11:12”,然后返回“11”和“12”。这是我的代码:

#include<stdio.h>
#include <string.h>
#include <conio.h>
int main(void)
{
char s[] = "";
char seperator[] = ":";
char *ch;
while (1)
{
scanf("%s", &s); //scanf("%s", &s);
if (s == -1) break;
char *result = NULL;
result = strtok(s, seperator);
while( result != NULL ) {
    printf( "result is \"%s\"\n", result );
    result = strtok( NULL, seperator );
}
fflush(stdout);

}
return 0;
}

但是当我输入“11:12”时,这是我的输出:

result is "11"
result is "12→ ("

我如何摆脱最后的“→(”?

3 个答案:

答案 0 :(得分:6)

您没有为“s”阵列分配任何内存。试试这样:

char s[128] = "";

另外,你正在使用参数&amp; s scanf 进行双重间接,没有必要,因为“s”将作为参数衰减为指针到功能。 试试这样:

  scanf("%s", s);

答案 1 :(得分:3)

您将s定义为长度为0的字符串

char s[] = "";

因此,当您使用scanf()读取长度为0的字符串时,会发生不好的事情。给它分配一些内存:

char s[100];

此外,您不需要&中的scanf()。只需scanf("%s", s)即可。

虽然我们正在努力,但是这又想做什么?

if (s == -1) break;

因为这不起作用...如果你想检查是否输入了"-1",你需要使用像strcmp这样的东西:

if (strcmp(s,"-1") == 0) break;

答案 2 :(得分:1)

您的代码具有未定义的行为

char s[] = "";

使用此行,您将声明一个长度为1的字符数组,这意味着您只能存储空值。因此,当您读取输入时,您将溢出s,从而调用UB。

您也可以删除scanf中的&s,因为数组名称与其地址相同。

另一个问题是:

if (s == -1) break;

s是一个数组,因此它的地址不能为-1。这种比较没有意义。