【问题标题】:Confused about GCC and scanf in C对 C 中的 GCC 和 scanf 感到困惑
【发布时间】:2016-07-27 19:13:11
【问题描述】:

我正在使用 GCC 来编译我的 C 代码。 我的第二个scanf 并没有停下来获取输入。 它只读取第一个scanf 并打印两个语句,一个是我在字符串中输入的,另一个是空白的。

int main (void) {
    setvbuf(stdout, NULL, _IONBF, 0);

    char string[25] = {'\0'};
    char c;

    scanf(" %s", string);  

    scanf(" o%c", &out);

    printf("Input is : %s \n\n", string);
    printf("Out is: %c", out);

    return 0;
}

而不是得到

输入是我输入的任何内容,并提示输入一个字符作为输出

我得到如下所示的输出

Input is : whatever i typed
Out is:

程序终止。有人可以帮忙吗。我做了一些研究,并尝试在 %c 之前放置一个空格用于输出和字符串,但仍然没有发生任何事情。

【问题讨论】:

  • 请说明exaclty您提供了什么输入。最好只运行程序并粘贴到 exact 日志中。您的第二个 scanf 期望输入包含字母 o 后跟另一个字符。这真的是你想要的吗?
  • o 真的是格式字符串" o%c" 吗?请注意,%s 在非空格字符后的第一个空格处停止读取。

标签: c gcc scanf


【解决方案1】:

您尚未定义outc 在这里没有使用。说了这么多

改变

scanf(" o%c", &out);  //What is that o in here? Is it a typo?

scanf(" %c", &out);

如果您的终端使用行缓冲输入

scanf(" %s", string);  

可以读取输入直到第一个空格。因此,来自空白空间的输入缓冲区未使用,可用于下一次 scanf 自动开始从缓冲区读取。所以如果你输入一个带空格的字符串,在你的情况下,空格将被分配给字符out

如下更改第一个 scanf 以清除缓冲区:

if( scanf(" %s", string) == 1)
{
while(getchar()!='\n')
  continue;
}

您也可能希望替换

scanf(" %s", string); 

fgets(string,25,stdin);
/* Use 26 if you actually wish to have max 25 characters
 * ie char string[26]={'\0'}
 */

fgets 的优点是它可以读取空格和换行符'\n' 并且在溢出的情况下会自动修剪输出。

【讨论】:

  • @diabai : 请看一下我刚刚添加的内容。
  • 我刚看到,再次感谢。我忘了说 scanf ("o%c", &out) for out 中的 o 只是要读取的第一个字母,以确定我要调用的输出方法的类型。
  • is just the first letter to be read !据我所知,这是非法的,会导致不确定的行为。查看此wiki article 以查看有效规范。
  • 您必须使用if (scanf(" %s", string) == 1) 限定您的while (getchar()..) 循环,否则它将挂在用户EOF 上。 (无论如何都要检查退货)
  • 您会惊讶于这对很多人来说是多么显而易见。最好是在安全方面。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2018-01-11
  • 2021-11-28
  • 2011-06-10
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多