0

我正在尝试扫描一个 int、一个 char、一个字符串和另一个 int。我认为我可以使用以下代码扫描所有这些:

int int1, int 2;
char char1;
char* string1;
fscanf(stdin, "%d %c %s %d", &int1, &char1, string1, &int2)

但是当我运行我的代码时,它会在我输入所有信息之前突然停止。我计划用换行符分隔变量。我的终端在运行时如下所示:

~$ ./program
100
K
word
~$

程序在我输入 int2 之前关闭,这让我相信 string1 可能也没有被考虑在内。关于如何解决这个问题的任何建议,或者更有效的替代方法?

4

2 回答 2

0

如果您已正确声明(或分配)您的变量,那么您给出的行将按预期工作。

在这段代码中:

    int int1, int2;
    char char1;
    char *string1;

    fscanf(stdin, "%d %c %s %d", &int1, &char1, string1, &int2);

正如string1此处未初始化的那样,这是未定义的行为。对于 Linux/glibc,如果string1碰巧包含0(NULL),它会导致scanf停止处理格式字符串,这将产生与您给出的相同结果。在其他系统上它可能会工作,它可能会崩溃。

这将按预期工作:

    int int1, int2;
    char char1;
    char string1[20];

    fscanf(stdin, "%d %c %19s %d", &int1, &char1, string1, &int2);
于 2013-03-19T20:20:36.833 回答
0
fscanf(stdin, "%d\n %c\n %s\n %d\n", &int1, &char1, string1, &int2)

\n - 取决于您的平台,在其中一些而不是 \n 应该是 \n\carriege return
所以,如果简要解释一下 - 您可以在“参数字符串”中提供将从流中排除的符号,它们的顺序很重要.
正如您所说,您不想在每个新行上放置标记,然后在参数字符串中放置新行的符号

于 2013-03-19T20:26:50.377 回答