私はCの初心者で、数字だけのscanfについて質問があります。私がする必要があるのは、3桁の入力でscanfすることです。その他の文字または記号はゴミとして評価する必要があります。または、使用する必要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 関数は、読み取った数値が配置される配列と配列内の数値の最大数を取り、標準入力から読み取った数値の数を返します。関数は、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;
}