將字串 1 的第 1、3、5、7、9... 位置字符複製到字串 2 並輸出。
例:"This Is a c Program" → "Ti s a cPram"(實際輸出見下)
C 語言字串索引從 0 開始:
| 位置(人類計數) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... |
|---|---|---|---|---|---|---|---|---|---|---|
| 索引(C 語言) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... |
| 字符 | T | h | i | s | I | s | a | ... |
「第 1、3、5... 位」對應索引 0, 2, 4, 6, 8...(偶數索引)。
#include <stdio.h>
#include <string.h>
void fun(char str1[], char str2[]) {
int i, j = 0;
int len = strlen(str1);
for (i = 0; i < len; i += 2) { // 步進 2,只取偶數索引
str2[j++] = str1[i];
}
str2[j] = '\0'; // 字串結尾標記,極重要!
}
int main() {
char str1[80] = "This Is a c Program";
char str2[80];
printf("原字串:%s\n", str1);
fun(str1, str2);
printf("結果:%s\n", str2);
return 0;
}
原字串:This Is a c Program 結果:Ti s a cPram
驗證:T(0) i(2) s(4) [空格](6) a(8) [空格](10) c(12) [空格](14) P(16) r(18) a(20) m(22)
| 錯誤寫法 | 問題 | 修正 |
|---|---|---|
for(i=1; i<len; i+=2) | 從索引 1 開始,取到第 2、4、6... 位 | 改為 i=0 |
漏寫 str2[j] = '\0' | 字串無結尾,輸出亂碼或崩潰 | 迴圈後必加結尾符 |
scanf("%s", str1) | 遇空格停止,無法讀取含空格字串 | 用 fgets(str1, 80, stdin) 或 scanf("%[^\n]", str1) |
| 未檢查緩衝區溢位 | 輸入超過 79 字元導致緩衝區溢位 | 用 fgets 限制長度,或動態配置記憶體 |
// 通用提取函式:從 start 索引開始,每 step 取一個字符
void extract_chars(const char *src, char *dest, int start, int step) {
int j = 0;
for (int i = start; src[i] != '\0'; i += step) {
dest[j++] = src[i];
}
dest[j] = '\0';
}
// 呼叫範例:
// extract_chars(str1, str2, 0, 2); // 題目需求:索引 0,2,4...
// extract_chars(str1, str2, 1, 2); // 取偶數位置:索引 1,3,5...
// extract_chars(str1, str2, 0, 3); // 每 3 個取 1 個:索引 0,3,6...
原題包含 NONO() 函式讀寫檔案進行自動評分,核心邏輯仍是 fun() 實作。考試時只需填寫 /***********begin***********/ 到 /************end************/ 之間的程式碼。
\0 結尾:%s、strlen、strcpy 等皆依賴此標記if (j >= dest_size - 1) break; 防溢位