我已经编写了一个程序,我想输入例如“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→ ("
我如何摆脱最后的“→(”?
答案 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。这种比较没有意义。