【问题标题】:Scanf_s keeps returning \0 instead of inputScanf_s 不断返回 \0 而不是输入
【发布时间】:2013-09-16 19:01:13
【问题描述】:

在我看来,我陷入了一项非常简单的任务。我写了一个程序,它选择一个随机数,让你猜测它是哪个,如果输入了字符“n”或“N”,最后退出程序。 代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int input_switcher(int input, int answer)
{
    if (input == answer)    {return 1;} 
    else if(input < answer) {return 2;}
    else if(input > answer) {return 3;}
    else                    {return 0;}
}

int main(void)
{
    int input, answer, tries;
    char keepGoing = 'J';
    srand((int)time(0));

    while(42)
    {
        input = 0, tries = 0;
        answer = 1;//rand()%100+1;

        printf("Jag \"t\x84nker\" p\x86 ett tal mellan 1 och 100, gissa vilket!\n");

            while(42)
            {
                printf("Gissning: ");
                scanf_s("%d", &input);

                switch (input_switcher(input, answer))
                {
                case 1:
                    printf("Grattis, det var r\x84tt!\n");
                    printf("Du gjorde %d f\x94rs\x94k.", tries);
                    break;
                case 2:
                    printf("Du gissade f\x94r l\x86gt, f\x94rs\x94k igen!\n");
                    tries++;
                    break;
                case 3:
                    printf("Du gissade f\x94r h\x94gt, f\x94rs\x94k igen!\n");
                    tries++;
                    break;
                default:
                break;
                }
                if(input == answer)     {break;}
            }
        printf("Ska vi spela en g\x86ng till(J/N)? ");
        scanf_s("%*c%c", &keepGoing);
        if(keepGoing == 'N' || keepGoing == 'n')        {return 0;}
        else if(keepGoing == 'J' || keepGoing == 'j')   {system("cls");}
    }   
    return 0;
}

我遇到的问题是我最后一个scanf_s 给了我\0 而不是我输入的字符。我发现了问题还是我错了?我可以改变什么来解决这个问题?

【问题讨论】:

  • 您可能想在您怀疑是问题根源的地方解释为什么选择特定格式说明符 "%*c%c"
  • @WhozCraig @WhozCraig %*c 用于消耗先前 scanf 条目的剩余 \n。
  • @MarcusWigert;在%c 说明符之前使用一个空格来使用\n

标签: c scanf


【解决方案1】:

您最后一个scanf_s 收到\n 而不是\0。吃掉这个\n改变

printf("Ska vi spela en g\x86ng till(J/N)? ");
scanf_s("%*c%c", &keepGoing);

 printf("Ska vi spela en g\x86ng till(J/N)? ");
 scanf_s(" %c", &keepGoing);
          ^
          |
   space before %c specifier

它正在工作。
输出:在带有 GCC 4.7.1 的 Win7 上

【讨论】:

  • 我在%c前面加了空格,问题依旧。
  • 你删除了%*c吗?
  • 在我重新启动计算机并修补 VS2012 后,它现在可以工作了。
【解决方案2】:

scanf() 就足够了,而不是 scanf_s ==>

这两个地方可以修改scanf

像这样:

scanf("%d", &input);  
scanf(" %c", &keepGoing); 
         ^  //use space here , to consume the leftover \n from previous scanf entry

如果您仍然遇到问题,您可以在最后一个 scanf_s() 之前使用 fflush(stdin); 在 Windows 中这将有效。

             fflush(stdin);  
             scanf("%c", &keepGoing);

【讨论】:

  • 为什么是scanf_s ==&gt;scanf
  • 其实OP不需要scanf_s,如果有安全增强,需要使用scanf_s。但我需要说。您只能使用 scanf 而不是 scanf_s。
  • fflush(stdin) 将调用未定义的行为。
  • @hacks 在 windows 中使用 fflush(stdin);不会调用 UB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2017-09-13
  • 2010-11-04
相关资源
最近更新 更多