2012-11-10 133 views
2

我在C中很新,我有一個關於scanf只是數字的問題。我需要做的是掃描輸入中只有3位數字,antoher字符或符號應評估爲垃圾。或者,也許我需要使用isdigit(),但我不確定它是如何工作的。我剛纔說的,但我知道,這是行不通的:數字掃描

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

但我需要閱讀3個獨立數字,例如,如果我輸入財產以後像:3nkt 6×4,需要有采取只是數字3,6,4 – user1814928

回答

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; 
} 

採樣輸入&輸出:

2332jbjjjh 7ssd 100 

2332 7 100 
+0

不錯的解決方案,但它不是通用的。由於使用sscanf功能,我給了我們投票 – Igor

0

稍微複雜的解決方案,但防止陣列的溢出和適用於任何類型的輸入。 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; 
} 
-2

試試這個。

如果第一個字符不是數字。 使用「%* [^ 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 

參考從:http://www.cplusplus.com/reference/cstdio/scanf/

+3

僅限代碼解答。請添加解釋(並確保將您的答案與多年前發佈的答案區分開來) – AndyG

+1

歡迎使用堆棧溢出!感謝您的代碼片段,它可能會提供一些即時的幫助。通過展示*爲什麼*這是一個很好的解決方案,對未來的讀者會有更好的解決方案,這將爲它的教育價值提供一個合適的解釋[//大大提高](// meta.stackexchange.com/q/114762)但不完全相同的問題。請編輯您的答案以添加解釋,並指出適用的限制和假設。 –