C语⾔零碎知识点之字符串数组
字符串数组的表⽰形式
在C语⾔中字符串数组有两种表⽰⽅法:
第⼀种,⼆维字符数组
可以利⽤⼆维字符数组来表⽰字符串,格式是:char strs[row][col];。例如:
char strs[4][6]={"hello","world","c","java"};// char 类型的⼆维数组
// 注意,也不⽀持先声明再赋值。即下⾯的赋值⽅式是错误的
char strs[4][6];
strs ={"hello","world","c","java"};
其中的 row 表⽰⼆维数组中的⾏,表⽰有⼏个字符串;⽽ col 表⽰⼆维数组中的列,表⽰能存放字符串的最⼤长度。
第⼆种,字符指针数组
可以⽤⼀维的字符指针数组来保存字符串,格式是:char* strs[len];。例如:
char* strs[4]={"hello","world","c","java"};// char* 类型的⼀维数组
注意,也不⽀持先声明再赋值。即下⾯的赋值⽅式是错误的
char* strs[4];
strs ={"hello","world","c","java"};
该⼀维数组中的每⼀个元素都是⼀个 char 类型的地址:
第⼀个指针 strs[0] 指向第⼀个字符串中的第⼀个字符。即 *strs[0] 等于 'h'。
第⼆个指针 strs[1] 指向第⼆个字符串中的第⼀个字符。即 *strs[1] 等于 'w'。
每个 strs[i] 都表⽰⼀个字符串,指针都指向对应字符串的第⼀个字符。
因此实际上这个⼀维数组并不存放真正的字符串,⽽只是存放字符串的地址。
从键盘输⼊字符串数组
有时候我们需要批量从键盘输⼊字符串,⽆论是⼆维字符数组还是⼀维字符指针数组,都可以通过循环输⼊字符串的⽅式来给字符串数组赋值,⽽从键盘输⼊字符串的⽅式有 scanf 和 gets 两种,根据情况选择即可:
⼆维字符数组表⽰的字符串数组的批量赋值
#include<stdio.h>
int main(){
// 声明⼆维字符数组,注意指定字符串个数和字符串最⼤长度
char strs[4][10];
// 通过循环批量输⼊字符串并赋值给字符串数组
for(int i =0; i <4; i++){
scanf("%s", strs[i]);
// 或者使⽤ gets() 函数
// gets(strs[i]);
}
// 打印结果
for(int i =0; i <4; i++){
printf("%s\n", strs[i]);
}
}
⼀维字符指针数组表⽰的字符串数组的批量赋值
#include<stdio.h>
#include<malloc.h>
int main(){
/
/ 声明⼀维字符指针数组
char*strs[4];
// 通过循环批量输⼊字符串并赋值给字符串数组
for(int i =0; i <4; i++){
// 声明字符串,并为其分配内存空间
char*str =(char*)malloc(sizeof(char)*10);
gets(str);// 使⽤ gets 函数从键盘读取输⼊
strs[i]= str;// 赋值
// 或者使⽤ scanf() 函数
// scanf("%s", str);
// 注意,我们不能直接使⽤ gets(strs[i]); 或者 scanf("%s", strs[i]); 来进⾏赋值
}
// 打印结果
for(int i =0; i <4; i++){
printf("%s\n", strs[i]);
}
}
输出字符串数组
输出字符串数组,实际上就是循环数组输出每个字符串,⽽输出字符串的函数有 printf 和 puts。
⽆论是⼆维字符数组还是⼀维字符指针数组,都可以通过循环遍历输出字符串数组中的所有字符串:#include<stdio.h>
int main(){
// ⼆维字符数组声明的字符串数组
char strs[4][10]={"tom","jack","rose","lily"};
for(int i =0; i <4; i++){
printf("%s\t", strs[i]);
}
printf("\n");
// ⼀维指针数组声明的字符串数组
char*strs2[4]={"java","javascript","python","c"};
for(int i =0; i <4; i++){
puts(strs2[i]);
}
}
访问字符串数组中的字符串
如果要访问⼆维字符数组声明的字符串数组中的字符串,可以通过两种⽅式:
下标,例如:strs[i]
数组名加下标,例如:*(strs + i)
#include<stdio.h>
int main(){
char strs[4][10]={"tom","jack","rose","lily"};
// 通过数组下标来访问,例如:strs[i],其中 i 是数组下标
printf("%s\n", strs[1]);
// 通过数组名加下标的⽅式来访问,例如:*(strs + i),其中 strs 是数组名,⽽ i 是数组下标
printf("%s\n",*(strs +2));
}
如果要访问⼀维字符指针数组声明的字符串数组中的字符串,也可以通过上⾯的两种⽅式来访问:
#include<stdio.h>
int main(){
char*strs[4]={"tom","jack","rose","lily"};
// 通过数组下标来访问,例如:strs[i],其中 i 是数组下标
printf("%s\n", strs[1]);
// 通过数组名加下标的⽅式来访问,例如:*(strs + i),其中 strs 是数组名,⽽ i 是数组下标
printf("%s\n",*(strs +2));
}
即⽆论是⼆维字符数组声明的字符串数组还是⼀维字符指针数组声明的字符串数组,都可以通过下标或者数组名加下标的⽅式访问数组中的字符串。
修改字符串数组中的字符串
只有⼆维字符数组声明的字符串数组才可以通过 strcpy 或者 sprintf 函数进⾏赋值,⽽⼀维字符指针数组声明的字符串数组不允许修改数组中的字符串:
#include<stdio.h>
#include<string.h>
int main(){
// 1.⼆维字符数组声明的字符串数组
char strs[4][10]={"tom","jack","rose","lily"};
// 1.1 使⽤ strcpy 函数进⾏赋值
strcpy(strs[1],"java");
// 1.2 使⽤ sprintf 函数进⾏赋值
sprintf(strs[2],"tomcat");
// 输出字符串,查看是否修改完成
for(int i =0; i <4; i++){
printf("%s\t", strs[i]);
}
// 2.⼀维字符指针数组声明的字符串数组,⽆法对字符串进⾏修改
char*strs2[4]={"java","javascript","c","c++"};
// 2.1 使⽤ strcpy 函数进⾏赋值,错误的⽰范
// strcpy(strs2[1], "JAVASCRIPT");
// 2.2 使⽤ sprintf 函数进⾏赋值,错误的⽰范
// sprintf(strs2[2], "C");
// 下⾯是错误的⽰例:
/
/ 通过数组下标来修改,这是错误的
// strs[1]="张三";
// 通过数组名加下标的⽅式来修改,这也是错误的
// *(strs+2)="李四";
}
访问字符串数组中的字符串的字符
如果是⼆维字符数组声明的字符串数组,可以通过如下两种⽅式来访问(其中 i 和 j 都是指数组的下标,⼀个是横坐标,⼀个是纵坐标,都从 0 开始):
下标,格式是:字符串数组名[i][j]。例如,strs[0][1]。
数组名加下标,格式是:*(*(字符串数组名 + i) + j)。例如,*(*(strs + 1) + 2)。
// 1.⼆维字符数组声明的字符串数组
char strs[4][10]={"tom","jack","rose","lily"};
// 1.1通过数组下标访问字符串数组中字符串中的字符
char c;
c = strs[1][1];
printf("%c\n", c);// 'a'
// 1.2通过数组名加下标的⽅式访问
c =*(*(strs +1)+2);
printf("%c\n", c);// 'c'
}
如果是⼀维指针数组声明的字符串数组,也可以通过上⾯两种⽅式来访问:
#include<stdio.h>
int main(){
/
/ 2.⼀维指针数组声明的字符串数组
char*strs[4]={"tom","jack","rose","lily"};
// 2.1通过数组下标访问字符串数组中字符串中的字符
char c;
c = strs[1][1];
printf("%c\n", c);// 'a'
// 2.2通过数组名加下标的⽅式访问
c =*(*(strs +1)+2);
printf("%c\n", c);// 'c'
}
修改字符串数组中的字符串的字符
如果是⼆维字符数组声明的字符串数组,可以通过如下两种⽅式来修改字符(其中 i 和 j 都是指数组的下标,⼀个是横坐标,⼀个是纵坐标,都从 0 开始):
下标,格式是:字符串数组名[i][j]='新字符'。例如,strs[0][1]='X'。
数组名加下标,格式是:*(*(字符串数组名 + i) + j)='新字符'。例如,*(*(strs + 1) + 2)='X'。
#include<stdio.h>
int main(){
// 1.⼆维字符数组声明的字符串数组
char strs[4][10]={"tom","jack","rose","lily"};
// 1.1通过数组下标访问字符串数组中字符串中的修改
strs[1][1]='X';
printf("%c\n", strs[1][1]);// 'X'
// 1.2通过数组名加下标的⽅式修改
*(*(strs +1)+2)='Y';
printf("%c\n",*(*(strs +1)+2));// 'Y'
// 打印字符串,查看是否修改成功
for(int i =0; i <4; i++){
puts(strs[i]);
}
}
但是对于通过⼀维指针数组声明的字符串数组,⾥⾯的字符串是⽆法修改的,⽽字符串⾥⾯的字符更不能修改。
// 2.⼀维字符指针数组声明的字符串数组
char*strs[4]={"tom","jack","rose","lily"};
// 2.1通过数组下标访问字符串数组中字符串中的修改
// strs[1][1] = 'X';// 错误的写法
// 2.2通过数组名加下标的⽅式修改
// *(*(strs + 1) + 2) = 'Y';// 错误的写法
}
遍历字符串数组中的所有字符串
即遍历字符串数组,⽆论是⼆维字符数组声明的字符串数组还是⼀维字符指针声明的字符串数组,都可以通过 for 循环等循环语句来遍历数组,然后通过下标(例如,strs[i])或者数组名加下标(例如,*(strs + i))的访问字符串:
#include<stdio.h>
int main(){
// 1.⼆维字符数组声明的字符串数组
char strs[4][10]={"java","javascript","c","c++"};
// 1.1通过 for 循环
for(int i =0; i <4; i++){
printf("%s\t", strs[i]);
}
printf("\n");
// 1.2通过 while 循环
int i =0;c语言如何创建字符串数组
while(i <4){
printf("%s\t",*(strs + i));
i++;
}
printf("\n");
// 2.⼀维字符指针数组声明的字符串数组
char*strs2[4]={"tom","jack","rose","lily"};
// 2.1通过 for 循环
for(i =0; i <4; i++){
printf("%s\t", strs2[i]);
}
printf("\n");
// 2.2通过 while 循环
i =0;
while(i <4){
printf("%s\t",*(strs2 + i));
i++;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。