首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言字串處理:提取奇數位置字符(索引 0,2,4...)實作詳解

     編輯:C 語言問答

題目需求

將字串 1 的第 1、3、5、7、9... 位置字符複製到字串 2 並輸出。
例:"This Is a c Program" → "Ti s a cPram"(實際輸出見下)

索引釐清:第 1 位 = 索引 0

C 語言字串索引從 0 開始:

位置(人類計數)123456789...
索引(C 語言)012345678...
字符This Is 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 開始:這是 C 語言最基本也最易混淆的概念
  • 字串必須以 \0 結尾:%s、strlen、strcpy 等皆依賴此標記
  • 緩衝區大小預留:目標陣列需足夠大(源字串長度/2 + 1)
  • 邊界檢查:實務開發應加入 if (j >= dest_size - 1) break; 防溢位
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved