有关c语言判断输入是否为数字的问题

嘿嘿嘿嘿嘿 发布于 2014/06/17 17:36
阅读 1K+
收藏 0

以下代码片段用来判断输入是否是数字。在输入前数字后字母时(如“123abc”),scanf会截取前面的“123”当做一个输入,把后面的“abc”当做第二个输入。

想问一下如何让程序识别到诸如“123abc”这种格式的输入,并当做错误输入打印出来?

int get_int(void)
{
    int input;
    char ch;
   
    while (scanf("%d", &input) != 1)
    {
        while ((ch = getchar()) != '\n')
            putchar(ch);  // dispose of bad input
        printf(" is not an integer.\nPlease enter an ");
        printf("integer value, such as 25, -178, or 3: ");
    }
   
    return input;
}
以下是整个程序,算平均和的。以上代码段在49至63行:
/* checking.c -- validating input */
#include <stdio.h>
#include <stdbool.h>
// validate that input is an integer
int get_int(void);
// validate that range limits are valid
bool bad_limits(int begin, int end, int low, int high);
// calculate the sum of the squares of the integers
// a through b
double sum_squares(int a, int b);
int main(void)
{
    const int MIN = -1000;  // lower limit to range
    const int MAX = +1000;  // upper limit to range
    int start;              // start of range
    int stop;               // end of range
    double answer;
   
    printf("This program computes the sum of the squares of "
           "integers in a range.\nThe lower bound should not "
           "be less than -1000 and\nthe upper bound should not "
           "be more than +1000.\nEnter the limits (enter 0 for "
           "both limits to quit):\nlower limit: ");
    start = get_int();
    printf("upper limit: ");
    stop = get_int();
    while (start !=0 || stop != 0) 
    {
        if (bad_limits(start, stop, MIN, MAX))
            printf("Please try again.\n");
        else
        {
            answer = sum_squares(start, stop);
            printf("The sum of the squares of the integers ");
            printf("from %d to %d is %g\n", start, stop, answer);
        }
        printf("Enter the limits (enter 0 for both "
               "limits to quit):\n");
        printf("lower limit: ");
        start = get_int();
        printf("upper limit: ");
        stop = get_int();
    }
    printf("Done.\n");
   
    return 0;
}

int get_int(void)
{
    int input;
    char ch;
   
    while (scanf("%d", &input) != 1)
    {
        while ((ch = getchar()) != '\n')
            putchar(ch);  // dispose of bad input
        printf(" is not an integer.\nPlease enter an ");
        printf("integer value, such as 25, -178, or 3: ");
    }
   
    return input;
}

double sum_squares(int a, int b)
{
    double total = 0;
    int i;
   
    for (i = a; i <= b; i++)
        total += i * i;
   
    return total;
}

bool bad_limits(int begin, int end, int low, int high)
{
    bool not_good = false;
    
    if (begin > end)
    {
        printf("%d isn't smaller than %d.\n", begin, end);
        not_good = true;
    }
    if (begin < low || end < low)
    {
        printf("Values must be %d or greater.\n", low);
        not_good = true;
    }
    if (begin > high || end > high)
    {
        printf("Values must be %d or less.\n", high);
        not_good = true;
    }
      
    return not_good;
}



加载中
0
wangxigui
wangxigui
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int get_int(){
  char numString[100];
  scanf("%s",numString);
  int N=strlen(numString);
  for(int i=0;i<N;i++){
    if(numString[i]<48||numString[i]>58)//字符"0-9"的ASCII码从48-58
        return -1;
   }
  int input = atoi(numString);//将字符串转换成数字
  return input;
}

int main(){
	int number = get_int();
	printf("number = %d",number);
}



嘿嘿嘿嘿嘿
谢谢
0
pseudo
pseudo
判断输入的字符的ascii码
0
未注册用户
未注册用户
直接保存为字符串,先预处理下,判断后再用sscanf同样方法读字符串。
0
中山野鬼
中山野鬼
哈,一直不理解scanf的使用价值,大家都喜欢用?难道是老师推广的功劳?有多少输入是需要通过scanf折腾的?
z
zhoutianzuo
回复 @中山野鬼 : 其实这些是基础,我很是觉得基础非常重要,我读书的时候c和c++的知识点几乎无盲点,工作以后也很挺得心应手。当然也同意你的看法咯,upgrade也很需要的。
中山野鬼
中山野鬼
回复 @zhoutianzuo : 初学者我认为更应该给些工程经验上的意见,他们缺乏这方面的认识,很容易走弯路。哈。有些大学或书本的教育内容,在工程上确实很没实用价值,大学和书本中理论是重要的。哈。
z
zhoutianzuo
回复 @中山野鬼 : 实际上工程不可以用人工输入的,呵呵。一般都是配置文件啦,所以,不要和初学者较真哦
中山野鬼
中山野鬼
回复 @zhoutianzuo : 哈,通过你的工程经验说个非要scanf的例子?
z
zhoutianzuo
回复 @中山野鬼 : 你让我脑洞大开,唉,控制台如何读取到文件呢?呵呵,其实,你直接用read(1, ****),不是更好?其实不管scanf问题多大,总归还是最简洁的办法了。
下一页
返回顶部
顶部