2015-02-08 60 views
1

我無法使用scanf將字符串存儲到2d數組中。將scanf值存儲到2d字符串數組中

爲了說明這一點,這是程序接受輸入:

p2/src/stuff:5: 
p3/src/stuff:5: 
p4/src/stuff:6: 

所以,我希望能夠用冒號分割字符串和數字,然後分開存放。所以理想情況下,我的二維數組看起來像這樣用於字符串:

[["p2/src/stuff"], ["p3/src/stuff"], ["p4/src/stuff"]] 

數字可以存儲在1d數組中。

這是我到目前爲止有:

int main() { 
     char *str; 
     char *i; 

     int n = 1; 
     while (n == 1) { 
       n = scanf("%m[^':']:%m[^':']:", &str, &i); 
     } 
     printf("# inputs read: %d\n", n); 
     printf("%s\n", str); 
     printf("%s\n", i); 
    } 

這將只打印第一行:

p2/src/stuff 
5 

我應該有劑量指針運算的迭代器?我不熟悉指針算術。

回答

2

scanf返回掃描的項目數。在這種情況下,它將是2而不是1.這裏返回1表示掃描期間出現問題。
%m說明符爲指針分配內存。使用一對指針,它們應該在循環的迭代中被釋放。您可以使用指針數組來存儲每個輸入。
該掃描集不需要單引號[^':']。如果您正在掃描所有不是冒號的字符[^:]將會起作用。
EOF將終止while循環,因此如果您正在從文件中讀取數據,它將在文件末尾停止。從stdin讀取可以使用Ctrl + D(Linux)或Ctrl + Z(Windows)終止。

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

int main() { 
    char *str; 
    char *i; 
    int n; 
    while ((n = scanf("%m[^:]:%m[^:]:", &str, &i)) == 2) { 
     printf("# inputs read: %d\n", n); 
     printf("%s\n", str); 
     printf("%s\n", i); 
     free (str); 
     free (i); 
    } 
    return 0; 
} 

編輯:
這使用指針數組以收集幾個輸入到STR和我陣列。

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

int main() { 
    char *str[10];// array of pointers 
    char *i[10]; 

    int each = 0; 
    int loop = 0; 
    int n = 0; 
    while ((n = scanf("%m[^:]:%m[^:]:", &str[each], &i[each])) == 2) { 
     printf("# inputs read: %d\n", n); 
     printf("%s\n", str[each]); 
     printf("%s\n", i[each]); 
     each++; 
     if (each > 9) { 
      break;//too many inputs for array size 
     } 
    } 
    for (loop = 0; loop < each; loop++) { 
     printf ("str[%d]=%s\n", loop, str[loop]);//print all the str inputs 
    } 
    for (loop = 0; loop < each; loop++) { 
     printf ("i[%d]=%s\n", loop, i[loop]);//print all the i inputs 
    } 
    for (loop = 0; loop < each; loop++) {//free memory 
     free (str[loop]); 
     free (i[loop]); 
    } 
    return 0; 
} 
+0

哇。那太糟糕了。難怪這不符合C11標準。感謝那裏的參考。 – 2015-02-08 13:05:27

2

這裏有幾個問題。

首先,雖然您應該使用字符指針,但您從不爲它們分配任何內存。接下來,當你使用scanf時,你不應該傳遞指針的地址,而是指針本身。這是一個很容易犯的錯誤,因爲您必須在使用整數類型的scanf時傳遞地址。

int main() { 
    char str[255]; 
    char i[255]; 

    int n = 1; 
    while (n == 1) { 
      n = scanf("%m[^':']:%m[^':']:", str, i); 
    } 
    printf("# inputs read: %d\n", n); 
    printf("%s\n", str); 
    printf("%s\n", i); 
} 
+0

順便說一句,我已經採取了任意使字符串各自255個字節的簡單方法。你真的應該使用一個函數,允許你限制輸入,以防止某人發送意外輸入時發生溢出。 – 2015-02-08 02:58:58

相關問題