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

C 語言字串截取:從第 n 個字元開始輸出的正確 scanf 與指針運算

     編輯:程式設計綜合問答

問題代碼


char str[100];
int n;
scanf("%s", str); // 讀字串
scanf("%d", n);   // 錯誤:缺 & 取址符
printf("%s", str + n); // 從第 n 個字元輸出 (0-based)

錯誤修正


scanf("%d", &n); // 必須加 & 取地址
// 或更安全:
if (scanf("%d", &n) != 1) { /* 錯誤處理 */ }

完整可運行程式


#include 
#include 

int main() {
    char str[100];
    int n;
    
    printf("輸入字串: ");
    if (scanf("%99s", str) != 1) return 1; // 限制長度防溢出
    
    printf("輸入起始位置 n (0-based): ");
    if (scanf("%d", &n) != 1) return 1;
    
    // 邊界檢查
    int len = strlen(str);
    if (n < 0) n = 0;
    if (n >= len) {
        printf("n 超出字串長度 (長度=%d)\n", len);
        return 0;
    }
    
    // 指針運算:str + n 指向第 n 個字元 (0-based)
    printf("結果: %s\n", str + n);
    
    return 0;
}

關鍵知識點

概念說明
`str`字串首地址 (指向 `str[0]`)
`str + n`指針加法:地址增加 `n * sizeof(char)`,指向 `str[n]`
`%s` 輸出從給定地址連續輸出字元直到 `\0`
0-based 索引C 語言陣列/字串索引從 0 開始,`n=0` 輸出整串,`n=1` 輸出第 2 個字元起

進階:1-based 使用者友好版


printf("輸入起始位置 (1 為第一個字元): ");
scanf("%d", &n);
if (n >= 1 && n <= len) {
    printf("結果: %s\n", str + n - 1); // 轉為 0-based
}

安全輸入替代方案:fgets + sscanf


char line[200];
fgets(line, sizeof(line), stdin); // 讀整行含空格
sscanf(line, "%99s %d", str, &n); // 解析

避免 `scanf` 留下換行符導致後續輸入異常。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved