在 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