首页 > 解决方案 > scanf 不给第二个变量赋值

问题描述

我一直在尝试从 C 中的用户那里读取一些输入,但它似乎并没有像我希望的那样工作。我尝试读取一个字符串,直到用户写入一个冒号,然后将冒号 (':') 分配给不同的变量。除非冒号是第一个字符,否则它工作得很好。在这种情况下,它只需将值 -52 分配给两个变量,并在下一个 scanf 中读取冒号。我尝试这样做,以便将冒号分配给第二个变量,即使它是第一个变量。我试过在网上寻找,但找不到任何解决方案......任何提示都会非常受欢迎,谢谢!

我的尝试:

char ch, name[200];
scanf("%[^:]%c", &name, &ch);
printf("%s\n%c\n", name, ch);

对于有效输入,例如:

Nadav Freedman: rest_of_input

它工作并分配"Nadav Freedman"name':'ch

但对于无效输入,例如:

: rest_of_input

尽管我想将冒号保存到ch.

标签: cinputscanf

解决方案


scanf一旦提供的任何说明符与输入不匹配,就会立即停止读取,因此在您的情况下,如果%[^:]失败,函数将停止读取并且说明%c符不会被处理。

因此,要强制它读取冒号,请使用 2scanf而不是 1:

char ch, name[200];
if(scanf(" %199[^:]", name) != 1) name[0] = '\0';
scanf("%c", &ch);
printf("%s\n%c\n", name, ch);

OBS:我还添加了前导空格来消除前导空白字符。并将其限制为最多读取 199 个字符,以免超过数组的大小name。如果第一个读取任何内容失败,还更改它以更新数组name以存储空字符串。scanf


推荐阅读