【问题标题】:Something goes wrong with scanfscanf 出了点问题
【发布时间】:2014-04-13 13:15:42
【问题描述】:

我已经把这段代码写成一个更大的程序的一部分:

   main()
{     int num;
      char word[50];
      list_head=NULL;


while(1)
      {     
            puts("Give number  : ");
            scanf("%d",num);
            if (num==0) break;
            printf("Give name : ");
            gets(word);
            if (strcmp(word,"")==0) break;
            add_node_to_list(num,word);
            }

当我运行程序时,屏幕上会出现“给号码:”消息,当我给号码时,会出现一条消息(“程序没有响应并将关闭”),就像万一发生的情况一样无限循环。我通过调试推断出问题是scanf,但我不确定。

【问题讨论】:

  • 试试这个scanf("%d%*c", &num);
  • 希望你的大程序不要像上面的sn-p那样缩进。
  • 不要使用gets(),输入过多会导致缓冲区溢出。

标签: c scanf


【解决方案1】:

两件事。

  1. 其他人提到的scanf() 中的&

    scanf("%d",&num);
    
  2. 取整数后,输入中多了一个\n 缓冲。所以gets()会输入""

    所以在scanf() 后面加上getchar()。这将带走 \n 来自输入缓冲区,gets() 将正常工作。

另外,最好not to use gets 用于字符串输入。

【讨论】:

    【解决方案2】:

    scanf(3) 需要变量的地址才能正常工作。

    改变

    scanf("%d",num);
    

    scanf("%d", &num);
    

    【讨论】:

      【解决方案3】:

      您应该提供数字的地址,而不是数字本身。现在应用程序正在尝试在第一次运行时写入地址 0。

      正确的方法是

      scanf("%d",&num);
      

      顺便说一句,如果您阅读过编译器警告,您就会知道。

      【讨论】:

      • 编译器没有给出警告。
      【解决方案4】:

      其他人所说的 - scanf("%d", &num) 中的 & 很重要。此外,您的 scanf 将读取数字,但 not 后面的换行符,因此您的 gets() 读取该换行符并产生一个空字符串。在 %d 后面留一个空白可以解决 - scanf("%d ", &num)

      通常,您根本不应该gets(),因为它不会检查缓冲区溢出(如果您输入超过 50 个字符会发生有趣的事情),但现在没关系,因为您仍在学习。

      【讨论】:

      • 我不同意 gets() 问题。您甚至不应该养成使用不安全、已弃用的功能的习惯。 gets() 是其中最糟糕的一个。
      • 我应该使用 insted 获取什么?
      • @chuckbartowski:使用char *fgets(char *s, int size, FILE *stream),你的缓冲区是char *sint size是缓冲区的大小,并且(在这种情况下)FILE *streamstdin
      猜你喜欢
      • 2016-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      相关资源
      最近更新 更多