前言

最近在寫北科實驗室練習題時,接觸了平時很少用的C語言,也發現在寫輸入讀取時比Python麻煩很多,於是做了統整練習筆記。

• 輸入範例

前兩個數字代表隨後要分別輸入 n、m 行,目標是存成兩個字串陣列,且每個陣列裡再將每串文字以空格為區分存成單詞。
如:前5行以article儲存,結果應為 article = [ [“Morning”,”mom”] , [“What”,”is”,”for”,”breakfast”] ….]等。
希望在輸入時就將文字做好處理。

1
2
3
4
5
6
7
8
9
10
11
12
5 6
Morning mom
What is for breakfast
Morning dear
Here are your eggs
Looks good
if Morning Good
rp Morning night
dl 1
dw 1 3
asa 4 thanks mom
c

• Python 寫法

input()讀資料,利用split()將字串以空格區分存到data,再append到list裡。(超便捷!)

1
2
3
4
5
6
7

artical = []

for i in range(m):
data = input().split()
artical.append(data)

• C 寫法 使用 scanf()

因為scanf()讀取到空格就會結束,因此使用 while 持續讀取單行字串,直到遇到換行符號跳出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

char article[50][100][100];

for (int i = 0; i < m; i++) {
int k = 0;
while (scanf("%s", article[i][k])) {
char ch ;
scanf("%c",&ch);
if ( ch == '\n' || ch == EOF) { // 如果是換行字元或達到檔案結尾就跳出迴圈
break;
}
k++;
}
}

• C 寫法 使用 gets() & strtok()

gets()直接讀取單行輸入,在此用[i-1]是因為一開始會讀到空白(但我其實不知道為什麼@@),用strtok讓指標token指向第一個遇到空格的文字,再strcpy()到list裡,strtok(NULL, “ “)繼續往下指找到下一個字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

char article[50][100][100];

for (int i = 0; i <= m; i++) {
gets(article[i-1][0]);
char *token = strtok(article[i-1][0], " ");
int k = 0;
while (token != NULL) {
strcpy(article[i-1][k], token);
token = strtok(NULL, " ");
k++;
}
}