1

我编写了一个程序,我想输入例如“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→ ("

我怎样才能摆脱最后一个“→(”?

4

3 回答 3

6

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

char s[128] = "";

另外,您正在使用参数&s对scanf进行双重间接,这是没有必要的,因为“s”将作为函数的参数衰减为指针。试试这样:

  scanf("%s", s);
于 2012-10-30T18:10:57.297 回答
3

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

char s[] = "";

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

char s[100];

此外,您&scanf(). 只会scanf("%s", s)做。

当我们这样做的时候,这是为了什么?

if (s == -1) break;

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

if (strcmp(s,"-1") == 0) break;
于 2012-10-30T18:11:23.460 回答
1

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

char s[] = "";

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

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

另一个问题是:

if (s == -1) break;

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

于 2012-10-30T18:13:10.433 回答