#include <stdio.h>
int main() {
putchar('A'); // 輸出 A
return 0;
}
#include <stdio.h>
int main() {
char ch = getchar();
putchar(ch); // 將讀取的字符輸出
return 0;
}
#include <stdio.h>
int main() {
puts("Hello, world!");
return 0;
}
stdin
)讀取一行字串(空白不影響)。#include <stdio.h>
int main() {
char str[100];
fgets(str, 100, stdin);
puts(str); // 輸出讀取的字串
return 0;
}
str
:用來存儲輸入內容的字元陣列。n
:最多能讀取的字元數(包括 '\0'
),實際可用字元數為 n-1
。stream
:輸入的數據(通常是 stdin
,即從鍵盤輸入)。fgets
包含換行符號。即下一次輸出換到第二行。#include <stdio.h>
int main() {
char ch;
char str[50];
// 1. 使用 getchar() 讀取一個字元,並使用 putchar() 輸出
printf("請輸入一個字元: ");
ch = getchar(); // 讀取一個字元
printf("您輸入的字元是: ");
putchar(ch); // 輸出該字元
putchar('\n'); // 換行
// 2. 使用 fgets() 讀取一行文字,並使用 puts() 輸出
printf("請輸入一段文字(最多 49 個字元): ");
fgets(str, 50, stdin); // 讀取字串
printf("您輸入的文字是: ");
puts(str); // 輸出該字串
return 0;
}
好,如果讀者有測試的話,會發現程式碼還沒讓你輸入一段文字就結束了,為甚麼呢?
問題分析: 當使用 getchar()
來讀取一個字元後,按下 Enter鍵時,會產生一個換行符 ('\n'
) 留在輸入緩衝區中,這會導致後面的 fgets()
直接讀取到這個換行符,而不是用戶想要輸入的文字。那怎麼怎麼解決?
方法一: 加入while(getchar() != '\n');
#include <stdio.h>
int main() {
char ch;
char str[50];
// 1. 使用 getchar() 讀取一個字元,並使用 putchar() 輸出
printf("請輸入一個字元: ");
ch = getchar(); // 讀取一個字元
printf("您輸入的字元是: ");
putchar(ch); // 輸出該字元
putchar('\n'); // 換行
while(getchar() != '\n'); //加入這一行
// 2. 使用 fgets() 讀取一行文字,並使用 puts() 輸出
printf("請輸入一段文字(最多 49 個字元): ");
fgets(str, 50, stdin); // 讀取字串
printf("您輸入的文字是: ");
puts(str); // 輸出該字串
return 0;
}
程式碼分析: 如果你今天輸入abcd然後按ENTER鍵,ch的值會被賦值為a,輸入緩衝區還會剩下bcd'\n',接著程式走到while(getchar() != '\n');
while迴圈開始繼續利用getchar()來讀取輸入緩衝區剩下的字符,最後當getchar()獨到'\n'
時,迴圈結束,這樣輸入緩衝區剩下的字符就不見了。
方法二: 改用scanf()
並在%[^\n]
前加一個空格,這個空格會告訴 scanf()
跳過所有的空白字符(包括 '\n'
、'\t'
和空格)。
#include <stdio.h>
int main() {
char ch;
char str[50];
// 1. 使用 scanf 讀取一個字元,並使用 putchar() 輸出
printf("請輸入一個字元: ");
ch = getchar(); // 讀取一個字元
printf("您輸入的字元是: ");
putchar(ch); // 輸出該字元
putchar('\n'); // 換行
// 2. 使用 scanf 讀取一段文字,避免 fgets() 問題
printf("請輸入一段文字(最多 49 個字元): ");
scanf(" %[^\n]", str); // 讀取一行,直到換行符
printf("您輸入的文字是: ");
puts(str); // 輸出該字串
return 0;
}
scanf(" %[^\n]", str);
,這裡的 %[^\n]
表示讀取非換行符的所有字符,直到遇到換行符\n
。 方法三: 使用%s
, scanf()
的 %s
會跳過這些符號,直到找到一個非空白字符。
#include <stdio.h>
int main() {
char ch;
char str[50];
// 1. 使用 scanf 讀取一個字元,並使用 putchar() 輸出
printf("請輸入一個字元: ");
ch = getchar(); // 讀取一個字元
printf("您輸入的字元是: ");
putchar(ch); // 輸出該字元
putchar('\n'); // 換行
// 2. 使用 scanf 讀取一段文字,避免 fgets() 問題
printf("請輸入一段文字(最多 49 個字元): ");
scanf("%s", str); // 讀取一行,直到換行符
printf("您輸入的文字是: ");
puts(str); // 輸出該字串
return 0;
}