字符串?dāng)?shù)組的表示形式
在C語言中字符串?dāng)?shù)組有兩種表示方法:
- 第一種,二維字符數(shù)組
可以利用二維字符數(shù)組來表示字符串,格式是:char strs[row][col];
。例如:
char strs[4][6] = {"hello", "world", "c", "java"};// char 類型的二維數(shù)組
// 注意,也不支持先聲明再賦值。即下面的賦值方式是錯誤的
char strs[4][6];
strs = {"hello", "world", "c", "java"};
其中的 row 表示二維數(shù)組中的行,表示有幾個字符串;而 col 表示二維數(shù)組中的列,表示能存放字符串的最大長度。
- 第二種,字符指針數(shù)組
可以用一維的字符指針數(shù)組來保存字符串,格式是:char* strs[len];
。例如:
char* strs[4] = {"hello", "world", "c", "java"};// char* 類型的一維數(shù)組
注意,也不支持先聲明再賦值。即下面的賦值方式是錯誤的
char* strs[4];
strs = {"hello", "world", "c", "java"};
該一維數(shù)組中的每一個元素都是一個 char
類型的地址:
- 第一個指針
strs[0]
指向第一個字符串中的第一個字符。即*strs[0]
等于'h'
。 - 第二個指針
strs[1]
指向第二個字符串中的第一個字符。即*strs[1]
等于'w'
。
每個 strs[i]
都表示一個字符串,指針都指向?qū)?yīng)字符串的第一個字符。
因此實際上這個一維數(shù)組并不存放真正的字符串,而只是存放字符串的地址。
從鍵盤輸入字符串?dāng)?shù)組
有時候我們需要批量從鍵盤輸入字符串,無論是二維字符數(shù)組還是一維字符指針數(shù)組,都可以通過循環(huán)輸入字符串的方式來給字符串?dāng)?shù)組賦值,而從鍵盤輸入字符串的方式有 scanf
和 gets
兩種,根據(jù)情況選擇即可:
- 二維字符數(shù)組表示的字符串?dāng)?shù)組的批量賦值
#include <stdio.h>
int main() {
// 聲明二維字符數(shù)組,注意指定字符串個數(shù)和字符串最大長度
char strs[4][10];
// 通過循環(huán)批量輸入字符串并賦值給字符串?dāng)?shù)組
for (int i = 0; i < 4; i++) {
scanf("%s", strs[i]);
// 或者使用 gets() 函數(shù)
// gets(strs[i]);
}
// 打印結(jié)果
for (int i = 0; i < 4; i++) {
printf("%s\n", strs[i]);
}
}
- 一維字符指針數(shù)組表示的字符串?dāng)?shù)組的批量賦值
#include <stdio.h>
#include <malloc.h>
int main() {
// 聲明一維字符指針數(shù)組
char *strs[4];
// 通過循環(huán)批量輸入字符串并賦值給字符串?dāng)?shù)組
for (int i = 0; i < 4; i++) {
// 聲明字符串,并為其分配內(nèi)存空間
char *str = (char *) malloc(sizeof(char) * 10);
gets(str);// 使用 gets 函數(shù)從鍵盤讀取輸入
strs[i] = str;// 賦值
// 或者使用 scanf() 函數(shù)
// scanf("%s", str);
// 注意,我們不能直接使用 gets(strs[i]); 或者 scanf("%s", strs[i]); 來進行賦值
}
// 打印結(jié)果
for (int i = 0; i < 4; i++) {
printf("%s\n", strs[i]);
}
}
輸出字符串?dāng)?shù)組
輸出字符串?dāng)?shù)組,實際上就是循環(huán)數(shù)組輸出每個字符串,而輸出字符串的函數(shù)有 printf
和 puts
。
無論是二維字符數(shù)組還是一維字符指針數(shù)組,都可以通過循環(huán)遍歷輸出字符串?dāng)?shù)組中的所有字符串:
#include <stdio.h>
int main() {
// 二維字符數(shù)組聲明的字符串?dāng)?shù)組
char strs[4][10] = {"tom", "jack", "rose", "lily"};
for (int i = 0; i < 4; i++) {
printf("%s\t", strs[i]);
}
printf("\n");
// 一維指針數(shù)組聲明的字符串?dāng)?shù)組
char *strs2[4] = {"java", "javascript", "python", "c"};
for (int i = 0; i < 4; i++) {
puts(strs2[i]);
}
}
訪問字符串?dāng)?shù)組中的字符串
如果要訪問二維字符數(shù)組聲明的字符串?dāng)?shù)組中的字符串,可以通過兩種方式:
- 下標(biāo),例如:
strs[i]
- 數(shù)組名加下標(biāo),例如:
*(strs + i)
#include <stdio.h>
int main() {
char strs[4][10] = {"tom", "jack", "rose", "lily"};
// 通過數(shù)組下標(biāo)來訪問,例如:strs[i],其中 i 是數(shù)組下標(biāo)
printf("%s\n", strs[1]);
// 通過數(shù)組名加下標(biāo)的方式來訪問,例如:*(strs + i),其中 strs 是數(shù)組名,而 i 是數(shù)組下標(biāo)
printf("%s\n", *(strs + 2));
}
如果要訪問一維字符指針數(shù)組聲明的字符串?dāng)?shù)組中的字符串,也可以通過上面的兩種方式來訪問:
#include <stdio.h>
int main() {
char *strs[4] = {"tom", "jack", "rose", "lily"};
// 通過數(shù)組下標(biāo)來訪問,例如:strs[i],其中 i 是數(shù)組下標(biāo)
printf("%s\n", strs[1]);
// 通過數(shù)組名加下標(biāo)的方式來訪問,例如:*(strs + i),其中 strs 是數(shù)組名,而 i 是數(shù)組下標(biāo)
printf("%s\n", *(strs + 2));
}
即無論是二維字符數(shù)組聲明的字符串?dāng)?shù)組還是一維字符指針數(shù)組聲明的字符串?dāng)?shù)組,都可以通過下標(biāo)或者數(shù)組名加下標(biāo)的方式訪問數(shù)組中的字符串。
修改字符串?dāng)?shù)組中的字符串
只有二維字符數(shù)組聲明的字符串?dāng)?shù)組才可以通過 strcpy
或者 sprintf
函數(shù)進行賦值,而一維字符指針數(shù)組聲明的字符串?dāng)?shù)組不允許修改數(shù)組中的字符串:
#include <stdio.h>
#include <string.h>
int main() {
// 1.二維字符數(shù)組聲明的字符串?dāng)?shù)組
char strs[4][10] = {"tom", "jack", "rose", "lily"};
// 1.1 使用 strcpy 函數(shù)進行賦值
strcpy(strs[1], "java");
// 1.2 使用 sprintf 函數(shù)進行賦值
sprintf(strs[2], "tomcat");
// 輸出字符串,查看是否修改完成
for (int i = 0; i < 4; i++) {
printf("%s\t", strs[i]);
}
// 2.一維字符指針數(shù)組聲明的字符串?dāng)?shù)組,無法對字符串進行修改
char *strs2[4] = {"java", "javascript", "c", "c++"};
// 2.1 使用 strcpy 函數(shù)進行賦值,錯誤的示范
// strcpy(strs2[1], "JAVASCRIPT");
// 2.2 使用 sprintf 函數(shù)進行賦值,錯誤的示范
// sprintf(strs2[2], "C");
// 下面是錯誤的示例:
// 通過數(shù)組下標(biāo)來修改,這是錯誤的
// strs[1]="張三";
// 通過數(shù)組名加下標(biāo)的方式來修改,這也是錯誤的
// *(strs+2)="李四";
}
訪問字符串?dāng)?shù)組中的字符串的字符
如果是二維字符數(shù)組聲明的字符串?dāng)?shù)組,可以通過如下兩種方式來訪問(其中 i 和 j 都是指數(shù)組的下標(biāo),一個是橫坐標(biāo),一個是縱坐標(biāo),都從 0 開始):
- 下標(biāo),格式是:
字符串?dāng)?shù)組名[i][j]
。例如,strs[0][1]
。 - 數(shù)組名加下標(biāo),格式是:
*(*(字符串?dāng)?shù)組名 + i) + j)
。例如,*(*(strs + 1) + 2)
。
#include <stdio.h>
int main() {
// 1.二維字符數(shù)組聲明的字符串?dāng)?shù)組
char strs[4][10] = {"tom", "jack", "rose", "lily"};
// 1.1通過數(shù)組下標(biāo)訪問字符串?dāng)?shù)組中字符串中的字符
char c;
c = strs[1][1];
printf("%c\n", c);// 'a'
// 1.2通過數(shù)組名加下標(biāo)的方式訪問
c = *(*(strs + 1) + 2);
printf("%c\n", c);// 'c'
}
如果是一維指針數(shù)組聲明的字符串?dāng)?shù)組,也可以通過上面兩種方式來訪問:
#include <stdio.h>
int main() {
// 2.一維指針數(shù)組聲明的字符串?dāng)?shù)組
char *strs[4] = {"tom", "jack", "rose", "lily"};
// 2.1通過數(shù)組下標(biāo)訪問字符串?dāng)?shù)組中字符串中的字符
char c;
c = strs[1][1];
printf("%c\n", c);// 'a'
// 2.2通過數(shù)組名加下標(biāo)的方式訪問
c = *(*(strs + 1) + 2);
printf("%c\n", c);// 'c'
}
修改字符串?dāng)?shù)組中的字符串的字符
如果是二維字符數(shù)組聲明的字符串?dāng)?shù)組,可以通過如下兩種方式來修改字符(其中 i 和 j 都是指數(shù)組的下標(biāo),一個是橫坐標(biāo),一個是縱坐標(biāo),都從 0 開始):
- 下標(biāo),格式是:
字符串?dāng)?shù)組名[i][j]='新字符'
。例如,strs[0][1]='X'
。 - 數(shù)組名加下標(biāo),格式是:
*(*(字符串?dāng)?shù)組名 + i) + j)='新字符'
。例如,*(*(strs + 1) + 2)='X'
。
#include <stdio.h>
int main() {
// 1.二維字符數(shù)組聲明的字符串?dāng)?shù)組
char strs[4][10] = {"tom", "jack", "rose", "lily"};
// 1.1通過數(shù)組下標(biāo)訪問字符串?dāng)?shù)組中字符串中的修改
strs[1][1] = 'X';
printf("%c\n", strs[1][1]);// 'X'
// 1.2通過數(shù)組名加下標(biāo)的方式修改
*(*(strs + 1) + 2) = 'Y';
printf("%c\n", *(*(strs + 1) + 2));// 'Y'
// 打印字符串,查看是否修改成功
for (int i = 0; i < 4; i++) {
puts(strs[i]);
}
}
但是對于通過一維指針數(shù)組聲明的字符串?dāng)?shù)組,里面的字符串是無法修改的,而字符串里面的字符更不能修改。文章來源:http://www.zghlxwxcb.cn/news/detail-802301.html
#include <stdio.h>
int main() {
// 2.一維字符指針數(shù)組聲明的字符串?dāng)?shù)組
char *strs[4] = {"tom", "jack", "rose", "lily"};
// 2.1通過數(shù)組下標(biāo)訪問字符串?dāng)?shù)組中字符串中的修改
// strs[1][1] = 'X';// 錯誤的寫法
// 2.2通過數(shù)組名加下標(biāo)的方式修改
// *(*(strs + 1) + 2) = 'Y';// 錯誤的寫法
}
遍歷字符串?dāng)?shù)組中的所有字符串
即遍歷字符串?dāng)?shù)組,無論是二維字符數(shù)組聲明的字符串?dāng)?shù)組還是一維字符指針聲明的字符串?dāng)?shù)組,都可以通過 for 循環(huán)等循環(huán)語句來遍歷數(shù)組,然后通過下標(biāo)(例如,strs[i]
)或者數(shù)組名加下標(biāo)(例如,*(strs + i)
)的訪問字符串:文章來源地址http://www.zghlxwxcb.cn/news/detail-802301.html
#include <stdio.h>
int main() {
// 1.二維字符數(shù)組聲明的字符串?dāng)?shù)組
char strs[4][10] = {"java", "javascript", "c", "c++"};
// 1.1通過 for 循環(huán)
for (int i = 0; i < 4; i++) {
printf("%s\t", strs[i]);
}
printf("\n");
// 1.2通過 while 循環(huán)
int i = 0;
while (i < 4) {
printf("%s\t", *(strs + i));
i++;
}
printf("\n");
// 2.一維字符指針數(shù)組聲明的字符串?dāng)?shù)組
char *strs2[4] = {"tom", "jack", "rose", "lily"};
// 2.1通過 for 循環(huán)
for (i = 0; i < 4; i++) {
printf("%s\t", strs2[i]);
}
printf("\n");
// 2.2通過 while 循環(huán)
i = 0;
while (i < 4) {
printf("%s\t", *(strs2 + i));
i++;
}
}
到了這里,關(guān)于C語言零碎知識點之字符串?dāng)?shù)組的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!