处理用户在C中输入字符串(错误处理)

时间:2014-03-21 21:37:43

标签: c

好的,我正在构建一个程序,它询问用户半金字塔应该有多高,然后用户输入一个1-24的整数(如果他们输入超出此范围的整数,我有一个while循环) )。

然后程序继续构建半金字塔。我的问题是,如果用户输入一个字符或字符串,基本上任何不是数字的程序都会崩溃,我已经搜索了所有但仍无法找到适用于我的情况的解决方案。

这是我的代码:

#include <stdio.h>

main()
{
     int height; //user inputs this
     int counter;
     int line;

     do
     {
        printf("What height should the half pyramid be?\n");
        scanf("%d", &height);

        printf("You typed in %d\n", height);

        if(height > 23 || height<1)
        {
            printf("The half pyramid must be no bigger than 23 and higher than 0 buddy\n");
        }
    }
    while(height >23 || height<1);

    for(line = 1; line <= height; line++)
    {
        int spaceNum = height - line;
        int spaceCounter;

        for (spaceCounter = 0; spaceCounter <= spaceNum ; spaceCounter++)
            printf(" ");

        for(counter = 0; counter < line ; counter++)
            printf("#");

        printf("\n");
    }

    return 0;
}

4 个答案:

答案 0 :(得分:1)

读入一个字符串并使用sscanf解析字符串。检查sscanf返回值,确认从中成功读取了多少个字段。

答案 1 :(得分:1)

为什么不检查scanf的返回值。

应该返回1.如果不是,它还没有读取整数。所以你需要吃一些缓冲剂。即一条到新线的字符串然后扔掉再问一遍

答案 2 :(得分:0)

您应该将输入的输入传递给strtol函数,该函数将输入作为长整数返回。如果输入不是有效数字,则返回0。如果该值超出范围,则函数返回LONG_MAXLONG_MIN(在limits.h中定义),并且errno设置为ERANGE。  执行条件测试,以便程序显示无效输入&#39;如果收到0,则会再次询问该号码。

来源:C++ Reference

答案 3 :(得分:0)

而不是scanf(),使用fgets()sscanf()strtol()

// scanf("%d", &height);
char buf[40];
fgets(buf, sizeof buf, stdin);
if (sscanf(buf, "%d", &height) != 1) Handle_InputError();