Scanf数字

时间:2012-11-10 18:21:04

标签: c scanf

我是C的新手,我有一个关于scanf的问题只是为了数字。我需要做的是输入只有3位数的scanf,antoher字符或符号应该被评估为垃圾。或者我可能需要使用isdigit(),但我不确定它是如何工作的。我就是这样,但我知道它不起作用:

scanf("%d, %d, %d", &z, &x, &y);

3 个答案:

答案 0 :(得分:4)

您可以读取字符串,使用扫描集对其进行过滤并将其转换为整数。

请参阅scanf:http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

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

int main(void)
{
    char num1[256], num2[256], num3[256]; 

    scanf("%s %s %s", num1, num2, num3);
    sscanf(num1, num2, num3, "%[0-9]d %[0-9]d %[0-9]d", num1, num2, num3);

    int n1 = atoi(num1), n2 = atoi(num2), n3 = atoi(num3); // convert the strings to int

    printf("\n%d %d %d\n", n1, n2, n3);

    return 0;
}

示例输入&amp;输出:

2332jbjjjh 7ssd 100

2332 7 100

答案 1 :(得分:0)

一个更复杂的解决方案,但可以防止数组溢出并适用于任何类型的输入。 get_numbers_from_input函数接受将放置读取数字的数组和数组中最大数字数,并返回从标准输入读取的数字的数量。函数从标准输入读取字符,直到按下enter。

#include <stdio.h>    
//return number readed from standard input
//numbers are populated into numbers array
int get_numbers_from_input(int numbers[], int maxNumbers) {
    int count = -1;
    char c = 0;
    char digitFound = 0;
    while ((c = getc(stdin)) != '\n') {
        if (c >= '0' && c <= '9') {
            if (!digitFound) {
                if (count == maxNumbers) {
                    break; //prevent overflow!
                }
                numbers[++count] = (c - '0');
                digitFound = 1;
            }
            else {
                numbers[count] = numbers[count] * 10 + (c - '0');
            }
        }
        else if (digitFound) {
            digitFound = 0;
        }
    }

    return count + 1; //because count starts from -1
}

int main(int argc, char* argv[])
{
    int numbers[100]; //max 100 numbers! 

    int numbersCount = get_numbers_from_input(numbers, 100);
    //output all numbers from input
    for (int c = 0; c < numbersCount; ++c) {
        printf("%d ", numbers[c]);
    }
    return 0;
}

答案 2 :(得分:-2)

试试这个。

如果第一个字符不是数字。 使用&#34;%* [^ 0-9]&#34;跳过不是数字的字符。

&#39; *&#39;是一个可选的起始星号表示数据将从流中读取但被忽略(即它不存储在参数指向的位置),并且&#39; ^&#39;表示任意数量的字符,它们都没有在括号中指定为字符。

#include <stdio.h>

int main()
{
    int x,y,z;
    if(!scanf("%d",&x)==1) scanf("%*[^0-9] %d",&x);
    if(!scanf("%d",&y)==1) scanf("%*[^0-9] %d",&y);
    if(!scanf("%d",&z)==1) scanf("%*[^0-9] %d",&z);
    printf("%d %d %d\n",x,y,z);
   return 0;
}

输入&amp;输出

fehwih 2738     @$!(#)12[3]
2738 12 3

参考文献:http://www.cplusplus.com/reference/cstdio/scanf/