我是 C 语言的新手,我有一个关于 scanf 的问题,只是针对数字。我需要做的是 scanf 只输入 3 位数字,其他字符或符号应该被评估为垃圾。或者也许我需要使用isdigit()
,但我不确定它是如何工作的。我只有那个,但我知道它不起作用:
scanf("%d, %d, %d", &z, &x, &y);
您可以读取一个字符串,使用扫描集对其进行过滤并将其转换为整数。
见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;
}
样本输入和输出:
2332jbjjjh 7ssd 100
2332 7 100
稍微复杂一点的解决方案,但可以防止数组溢出并适用于任何类型的输入。get_numbers_from_input 函数采用将放置读取数字的数组和数组中的最大数字计数,并返回从标准输入读取的数字计数。函数从标准输入中读取字符,直到按下回车键。
#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;
}
试试这个。
如果第一个字符不是数字。使用 "%*[^0-9]" 跳过不是数字的字符。
' * ' 是一个可选的起始星号,表示数据将从流中读取但被忽略(即它不存储在参数指向的位置),而 ' ^ ' 表示任意数量的字符,它们都没有指定为括号之间的字符。
#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;
}
输入输出
fehwih 2738 @$!(#)12[3]
2738 12 3