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

C 語言基礎教程(二):陣列賦值詳解——數值陣列、字串陣列、指標陣列與 strcpy/snprintf 實務

     編輯:C 語言基礎

陣列賦值:逐元素存入,無整體賦值運算子

C 語言不支援 arr1 = arr2; 或 arr = {1,2,3}; (僅初始化時可用大括號)。賦值必須逐元素或呼叫庫函數。

1. 數值陣列:迴圈或逐元素賦值


int m[2][2];
float f[3];

/* 逐元素 */
m[0][0] = 0; m[0][1] = 17; m[1][0] = 21;
f[0] = 109.5f; f[1] = -8.29f; f[2] = 0.7f;

/* 迴圈賦值 (較實用) */
for (int i = 0; i < 3; ++i) f[i] = i * 1.5f;

/* 結構體陣列可整體賦值 (C99 指定初始化器僅限初始化) */
struct Pt { int x, y; } pts[2];
pts[0] = (struct Pt){1,2};  /* 複合常值 (C99) */
pts[1] = pts[0];            /* 結構體賦值合法 */

2. 字串陣列:strcpy / strncpy / snprintf


char s[30];
strcpy(s, "Good News!");           /* 簡單、不檢查長度,危險 */

strncpy(s, "Good News!", sizeof s); /* 複製至多 n 字元,不保證以 \0 結尾 */
s[sizeof s - 1] = '\0';             /* 強制終止 */

/* 推薦:snprintf 保證不溢位、保證以 \0 結尾、回傳所需長度 */
snprintf(s, sizeof s, "Good News!");

長字串分行技巧


char buf[200];
snprintf(buf, sizeof buf,
    "The writer would like to thank you for"
    "your interest in his book. He hopes you"
    "can get some helps from the book.");
/* 編譯器自動串接相鄰字串常值 */

3. 指標陣列賦值:每個元素指向有效記憶體


char *f[2];
int *a[2];

f[0] = "thank you";     /* 指向字串常值 (唯讀) */
f[1] = "Good Morning";

/* 整數指標陣列:需先配置指向物件 */
int v1 = 1, v2 = -11;
a[0] = &v1;
a[1] = &v2;

/* 或動態配置 */
a[0] = malloc(sizeof(int));
*a[0] = 1;
a[1] = malloc(sizeof(int));
*a[1] = -11;

關鍵區別:字串陣列 vs 字串指標陣列

宣告儲存內容賦值方式可修改內容
char s[30];字元陣列 (緩衝區)strcpy(s, ...)是
char *p;指標 (存位址)p = "literal"; 或 p = malloc(...)視指向物件而定
char *f[2];指標陣列f[0] = "...";視各指標指向而定

常見錯誤與修正

  1. char s[10]; s = "Hi"; → strcpy(s, "Hi");
  2. char *p; strcpy(p, "Hi"); (野指標) → char *p = malloc(20); strcpy(p, "Hi");
  3. strncpy(s, "Long", sizeof s); 忘加 s[sizeof s-1]='\0'; → 改用 snprintf。
  4. char *p = "Hi"; p[0] = 'B'; (修改常值 UB) → char p[] = "Hi"; p[0] = 'B';

現代實務建議

  • 統一使用 snprintf:安全、可攜、可檢查截斷。
  • 字串緩衝區尺寸用常數/巨集:#define MAX_PATH 260,避免魔術數字。
  • 指標陣列改用結構體陣列:struct Item { char *name; int val; } items[2]; 語意更清晰。
  • C++ 專案直接用 std::vector 免去手動管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved