C 语言中的字符串数组
本文将演示关于如何在 C 语言中声明一个字符串数组的多种方法。
使用二维数组符号在 C 语言中声明字符串数组
C 语言中的字符串只是存储在连续内存区域中的字符序列。关于字符串的一个区别是,在序列的最后存储了一个终止的空字节/0
,表示一个字符串的结束。如果我们用 []
符号声明一个固定的 char
数组,那么我们就可以在该位置存储一个由相同数量的字符组成的字符串。
需要注意的是,在将字符字符串复制到数组位置时,应该考虑多出一个终止空字节的字符空间。因此,可以用括号符号声明一个二维的 char
数组,并利用它作为字符串的数组。数组的二维将限制字符串的最大长度。在这种情况下,我们任意定义一个宏常量-MAX_LENGTH
等于 100 个字符。整个数组可以用 {""}
符号初始化,将数组中的每个 char
元素清零。当在已经初始化的数组中存储字符串值时,不允许使用赋值运算符,应使用特殊的内存复制函数,如 strcpy
。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define MAX_LENGTH 100
#define NUM_STRINGS 10
int main(){
char arr[NUM_STRINGS][MAX_LENGTH] = {""};
arr2[0] = "string literal"; // Not permitted
strcpy(arr[0], "hello world");
printf("%s\n", arr[0]);
printf("%s\n", strcpy(arr[0], "hello world"));
exit(EXIT_SUCCESS);
}
输出:
hello world
hello world
另外,我们也可以在声明二维字符数组时立即初始化。现代 C11 标准允许用字符串字元初始化 char
数组,甚至当数组长度大于字符串本身时,可以自动在字符串末尾存储空字节。初始化列表的符号与 C++ 语法类似。每一个大括号的元素都应该存储在一个长度为 MAX_LENGTH
的连续内存区域。如果初始化器符号指定的元素少于数组大小,那么剩余的元素将被隐式初始化为\0
字节。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define MAX_LENGTH 100
#define NUM_STRINGS 10
int main(){
char arr2[NUM_STRINGS][MAX_LENGTH] = { {"first string"},
{"second string"},
{"third string"},
{"fourth string"},
{"fifth string"} };
for (int i = 0; i < NUM_STRINGS; ++i) {
printf("%s, ", arr2[i]);
}
exit(EXIT_SUCCESS);
}
输出:
first string, second string, third string, fourth string, fifth string, , , , , ,
在 C 语言中使用 char*
数组符号来声明字符串数组
char*
是通常用于存储字符串的类型。声明 char*
的数组,我们就可以得到固定数量的指针,指向相同数量的字符串。它可以用字符串字元初始化,如下面的例子所示,也可以使用头 <string.h>
中提供的特殊函数分配或复制。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define MAX_LENGTH 100
#define NUM_STRINGS 10
int main(){
char *arr3[NUM_STRINGS] = { "first string",
"second string",
"third string",
"fourth string",
"fifth string" };
char* str1 = "string literal";
arr3[8] = str1;
arr3[9] = "hello there";
for (int i = 0; i < NUM_STRINGS; ++i) {
printf("%s, ", arr3[i]);
}
printf("\n");
exit(EXIT_SUCCESS);
}
输出:
first string, second string, third string, fourth string, fifth string, (null), (null), (null), string literal, hello there,
另一种选择是,我们可以只指定 {}
括号,这将使数组中的指针初始化为 null
,它们可以在以后用于存储其他字符串地址,或者程序员甚至可以分配动态内存。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define NUM_STRINGS 10
int main(){
char *arr4[NUM_STRINGS] = {};
for (int i = 0; i < NUM_STRINGS; ++i) {
printf("%s, ", arr4[i]);
}
printf("\n");
exit(EXIT_SUCCESS);
}
输出:
(null), (null), (null), (null), (null), (null), (null), (null), (null), (null),
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