在 C 語言中列印字元陣列

Jinku Hu 2023年1月30日 2021年1月22日
  1. 在 C 語言中使用 for 迴圈列印字元陣列的方法
  2. 使用 printf%s 指定符在 C 語言中列印字元陣列
在 C 語言中列印字元陣列

本文將介紹關於如何在 C 語言中列印字元陣列的多種方法。

在 C 語言中使用 for 迴圈列印字元陣列的方法

如果我們想分別列印陣列元素,並以更多的細節格式化輸出,for 迴圈是最明顯的解決方案。該方法的關鍵前提是,我們應該事先知道陣列的長度。

需要注意的是,我們可以使用其他的迭代方法,比如 while 迴圈,但是我們應該知道迭代應該在什麼時候停止的值,否則,迭代就會越界丟擲錯誤。

在下面的例子中,我們演示了 for 迴圈方法,並對六個字元的陣列精確地迭代了 6 次。

#include <stdio.h>
#include <stdlib.h>

#define STR(num) #num

int main(void) {
    char arr1[] = { 'a', 'b', 'c', 'd', 'e', 'f' };

    printf(STR(arr1)": ");
    for (int i = 0; i < 6; ++i) {
        printf("%c, ", arr1[i]);
    }
    printf("\b\b\n");

    exit(EXIT_SUCCESS);
}

輸出:

arr1: a, b, c, d, e, f

使用 printf%s 指定符在 C 語言中列印字元陣列

printf 函式是一個強大的格式化輸出函式。它可以對輸入變數進行型別指定符的操作,並對變數進行相應的處理。

也就是說,字元陣列內部的結構與 C 式字串相同,只是 C 式字串的字元總是以\0 位元組結束,表示結束點。如果我們在字元陣列的末尾加上 null 位元組,我們可以通過單行 printf 呼叫列印整個陣列。

如果沒有指定結束的 null 位元組,並且用這個方法呼叫 printf,程式可能會嘗試訪問記憶體區域,這很可能會導致分段錯誤。

#include <stdio.h>
#include <stdlib.h>

#define STR(num) #num

int main(void) {
    char arr1[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    char arr2[] = { 't', 'r', 'n', 'm', 'b', 'v', '\0' };

    printf("%s\n", arr1);
    printf("%s\n", arr2);

    exit(EXIT_SUCCESS);
}

輸出:

abcdeftrnmbv
trnmbv

正如你所看到的,當我們列印沒有 null 結束符的 arr1 時,我們會得到更多的字元,直到迭代到一個 null 結束符-\0

另一種使 printf 函式特殊化的方法是在%s 指定符內傳遞字串中的字元數。一種方法是在符號%s 之間用整數硬編碼字串的長度,也可以用*符號代替,從 printf 引數中取另一個整數引數。請注意,這兩種方法都在數字或星號前加上 . 字元。

#include <stdio.h>
#include <stdlib.h>

#define STR(num) #num

int main(void) {
    char arr1[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    char arr2[] = { 't', 'r', 'n', 'm', 'b', 'v', '\0' };

    printf("%.6s\n", arr1);
    printf("%.*s\n", (int)sizeof arr1, arr2);

    exit(EXIT_SUCCESS);
}

輸出:

abcdef
trnmbv
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C Array