2010-03-29 377 views
4

我已經在C中編寫了一個應用程序,它需要輸入兩行。 第一個輸入說明了int數組的大小,第二個輸入包含由空格分隔的值。 例如,下面的輸入C,從單個輸入行(scanf?)讀取多個數字

5 
1 2 3 4 99 

應該創建一個包含{1,2,3,4,99}

什麼是這樣做的最快方法數組?我的問題是讀取多個數字而不循環整個字符串來檢查它是空格還是數字?

謝謝。

回答

10
int i, size; 
int *v; 
scanf("%d", &size); 
v = malloc(size * sizeof(int)); 
for(i=0; i < size; i++) 
    scanf("%d", &v[i]); 

在完成後請記住free(v)

另外,如果由於某種原因,你已經擁有了數字字符串中,你可以使用sscanf()

+0

我以爲它會查找以「\ n」分隔的數字? – migajek 2010-03-29 17:24:13

+2

'%d'(以及大多數%的轉換,但不是全部)會自動跳過任何空格。閱讀scanf文檔以獲取詳細信息! – 2010-03-29 17:27:53

+2

「如果由於某種原因」?你不應該使用'scanf',而應該使用'fgets'和'sscanf'。 http://c-faq.com/stdio/scanfprobs.html – jamesdlin 2010-03-29 19:16:55

0

scanf()是一種痛苦的脖子。檢查strtol()這種問題,它會讓你的生活變得非常簡單。

+1

在一起,這可能是有趣的,但我不知道如何閱讀整體第一行;/ – migajek 2010-03-29 17:09:48

+0

@michal,'fgets()'將讀取一行。我不知道爲什麼你需要'strtok()'來解決你的問題。 – 2010-03-29 17:11:57

+0

strtol將只給第一個號碼。那不是這裏的目的? – 2014-04-12 09:21:36

1

這裏是http://www.cplusplus.com/reference/cstring/strtok/,我已經適應了我們的背景下采取的例子。

它分裂子鏈中的str鏈,然後我將每個部分轉換爲int。我期望輸入行是用逗號分隔的數字,沒有別的。大小是你的數組的大小。你應該做scanf(「%d」,&大小);正如德尼爾森在答覆中所述。最後,你有你所有值的int數組。

int main(){ 
    int size = 5, i = 0; 
    char str[] ="10,20,43,1,576"; 
    int list[size]; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str,","); 
    list[i] = atoi(pch); 
    i++; 
    while (pch != NULL) 
    { 
    pch = strtok (NULL, ","); 
    if(pch != NULL) 
     list[i] = atoi(pch); 
    i++; 
    } 

    for(i=0;i<size;i++){ 
    printf("%d. %d\n",i+1,list[i]); 
    } 
    return 0; 
} 
1

這裏「N」是數組的數組元素的數目「A」

int N, A[N]; 
printf("Input no of element in array A: "); 
scanf("%d", &N); 
printf("You entered: %d\n", N); 
printf("Input array A elements in one line: "); 
for(int i=0; i<N; i++){ 
    fscanf(stdin, "%d", &A[i]); 
    printf("A[%d] is: %d\n", i, A[i]); 
} 
+1

您可以通過解釋OP如何回答問題來改善您的答案。 – MicroVirus 2015-11-21 12:02:16

-1

此代碼採用的通過的getchar()讀取每個字符一直接的方法。我們去到讀取數UTIL我們發現陣列that.This後得到更新的「我」空白space.The指數反覆進行,直至換行(「\ n」)與strtok的遭遇

#include<iostream> 
main() 
{ 
    char ch; 
    int arr[30] ; 
    ch =getchar(); 
    int num = 0; 
    int i=0; 
    while(ch !='\n') 
    { 
    if(ch == ' ') 
    { 
     arr[i] = num; 
     i++; 
     num = 0; 
    } 
    if(((ch -48) >=0) && (ch-48 <=9)) 
     num = (num*10) + (ch - 48); 
    ch = getchar(); 
    } 
    arr[i] = num; 
    for(int j=0;i<=i;j++) 
    std::cout<<arr[i]<<" "; 
} 
+0

雖然此代碼可能回答這個問題,但提供有關如何解決問題和/或爲何解決問題的其他上下文可以提高答案的長期價值。請閱讀此https://stackoverflow.com/help/how-to-answer – 2017-06-17 17:43:49

+0

當數字爲負數或以「+」開頭時,此方法失敗。它不是C代碼。 – chux 2018-01-30 23:57:17