【问题标题】:C -- Neither scanf or fgets seem to execute [duplicate]C - scanf 或 fgets 似乎都没有执行
【发布时间】:2017-06-11 00:18:53
【问题描述】:

我似乎无法让任何一个函数使用此代码执行任何操作。我 99% 确定我的格式是正确的,并且我已经多次测试了这些函数本身。似乎只有在这里我遇到了任何问题。

如果这是一个愚蠢的问题,我深表歉意;如果是我会删除这个。如果组织方式看起来很奇怪,我还删除/修改了与问题无关的代码。

使用 fget:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

char name[50];
char yesno;

void sleep() {
    printf("Try again?    (y/n)\n" );
    scanf("%s", &yesno);
    if (yesno == 'y') {
        puts("Name?");

        fgets(name,50,stdin);
        printf("Name is %s\n", name);

    }
    else {
        printf("Null");
    }
}

int main() {
    puts("Begin?    y/n");
    scanf("%s", &yesno);
    if (yesno == 'y') {
        sleep();
    }
}

代码编译正确,但运行时退出

Name?
Name is

一旦执行到那个点。

用scanf代替fgets,

scanf("%[^\n]s", name);

同样的问题也会发生。奇怪的是,

scanf("%s", name);

有效,但显然只扫描直到达到空白。

【问题讨论】:

  • 对不起,如果不清楚 - 我没有混合它们;我是说使用 scanf 或 fgets 都会导致同样的问题。还是我误会了你?
  • @Badda:感谢您提供的链接。这是一本很好的读物——它会启发很多人。
  • “%s”格式说明符用于字符串,而不是字符。由于yesnochar,因此使用格式说明符%s 传递其地址是没有意义的。

标签: c scanf fgets


【解决方案1】:

你需要清除缓冲区,因为有\n,当你fgets(name,50,stdin);你只是读取你最后输入的\n,(当你输入y并按回车时,回车是\n),所以你需要先阅读它,然后再阅读另一个单词,为此,一种简单的方法是在fgets(name,50,stdin); 之前添加getchar();,它可以正常工作。但是当你的缓冲区中有很多字符时(在另一个应用程序中)你可以添加它来清除所有缓冲区while ((c = getchar()) != '\n' &amp;&amp; c != EOF) { }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多