字符串,字符数组的初始化

先上代码:

#include<stdio.h>

int main()
{
	char* s1 = (char *)"aaaaa";
	//	char * s2={'b','b','b','b','b'};//[Error] scalar object 's2' requires one element in initializer
	char s3[] = "ccccc";
	//	char s4[5]="ddddd";//[Error] initializer-string for array of chars is too long [-fpermissive]
	char s4[5] = "dddd";
	char s5[] = { 'e','e','e','e','e' };
	char s6[5] = { 'f','f','f','f','f' };

	printf("%s\n", s1);
	printf("%s\n", s3);
	printf("%s\n", s4);
	printf("%s\n", s5);
	printf("%s\n", s6);

	for (int i = 0;i < sizeof(s1) + 1;i++)//此处sizeof(s1)=4,因为s1是char * 类型,size恒为4。故不能打印出整个字符串。
		printf("%d.%c\t", i, s1[i]);
	printf("\n");
	for (int i = 0;i < sizeof(s3) + 1;i++)
		printf("%d.%c\t", i, s3[i]);
	printf("\n");
	for (int i = 0;i < sizeof(s4) + 1;i++)
		printf("%d.%c\t", i, s4[i]);
	printf("\n");
	for (int i = 0;i < sizeof(s5) + 1;i++)
		printf("%d.%c\t", i, s5[i]);
	printf("\n");
	for (int i = 0;i < sizeof(s6) + 1;i++)
		printf("%d.%c\t", i, s6[i]);

}

其中char* s1 = (char *)“aaaaa”;在有些编译器中不强制转化只会warning不会报错。

输出五个字符串如下:
打印结果

调试过程中:
局部变量属性

s1在内存中:
S1

"aaaaa"是字符串常量,被分配在静态区(可以看到s1内存地址与s3,s4,s5,s6都不太相同),强制类型转化后赋值给s1。

s3在内存中:
S3

s3实际长度为6,末尾自动添加上了’\0’。

s4在内存中:
S4

s5在内存中:
S5
s6在内存中:
S6
可以看到:五个字符串中,后两个字符串输出异常,对应其在内存中的情况不难发现后两个字符串在内存中结尾并没有’\0’,即0x00。因而无法识别其结尾而打印出无效内容。

五个字符串按字符打印效果(打印长度比字符串长度多1)
单字符打印结果

s1实际长度为6;
另外以字符形式赋值给s5,s6字符串,末尾并没有自动添加上’\0’。

二维字符数组、二维字符串数组初始化

	char s7[][4] = { "aaa","bbb","ccc","ddd" };
	//由于数组第二维为4,去掉默认在字符串尾部添加的'\0'字符,赋值时每个字符串长度不能超过4-1。长度小于3时,空余部分填充的好像都是'\0'。
	char s8[][4]={'a','a','a','\0','b','b','b','\0','c','c','c','\0','d','d','d','\0'};
	//以字符形式为数组赋值时,每行最后元素需要人为添加'\0',否则无法以字符串形式打印出某一行。
	char *s9[3]={"aaaaa","bbbb","ccc"};
	//含有3个元素的指针数组:每个数组元素是一个指向字符串常量的指针(该字符串常量长度任意)。
	char *s10[3][3]={{"asdx","qwer","fdsfaf"},{"44444","555","6666"},{"a78x","q3er","f2f"}};
	//二维字符串数组,每个数组元素是一个指向字符串常量的指针。
	
	printf("%s\n", s7[0]);
	printf("%s\n", s8[1]);
	printf("%s\n", s9[2]);
	printf("%s\n", s10[0][1]);

【有些编译器会因为将const char * 类型赋值给char * 类型变量而直接报错】
【数组第一维大小可以缺省,缺省时在s8的赋值方式下,需要保证每一行元素数量相等且等于4(包括’\0’在内)】
打印结果:
aaa
bbb
ccc
qwer

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 字符串二维数组初始化可以使用以下方式: ```c char str_array[3][10] = { "hello", "world", "foo" }; ``` 这里的 `str_array` 是一个包含 3 个字符串数组,每个字符串最多可以包含 10 个字符。在初始化时,我们可以使用花括号 `{}` 来分别指定每个字符串的内容。注意,如果字符串的长度小于数组的长度,则会在字符串末尾自动添加一个空字符 `\0`。如果字符串的长度超过数组的长度,则只会截取相应的部分。 ### 回答2: 字符串二维数组初始化的方法有很多种。下面我介绍几种常用的方法。 方法一:使用静态初始化 静态初始化是指在定义二维数组时直接给出初始化的值。例如: ```java String[][] strArray = { {"Hello", "World"}, {"Good", "Morning"} }; ``` 方法二:使用动态初始化 动态初始化是指在定义二维数组时只指定数组的大小,然后再通过循环为每个元素赋值。例如: ```java String[][] strArray = new String[2][2]; strArray[0][0] = "Hello"; strArray[0][1] = "World"; strArray[1][0] = "Good"; strArray[1][1] = "Morning"; ``` 方法三:使用二重循环初始化 通过两层循环来遍历二维数组的每个元素,然后根据需要进行初始化。例如: ```java String[][] strArray = new String[2][2]; for (int i = 0; i < strArray.length; i++) { for (int j = 0; j < strArray[i].length; j++) { strArray[i][j] = "Value" + i + j; } } ``` 不管使用哪种初始化方法,我们都可以通过下标来访问和修改二维数组中的元素。例如,要访问二维数组中的第一个元素,可以使用`strArray[0][0]`的方式来访问。 ### 回答3: 字符串二维数组初始化是将一个包含多个字符串元素的二维数组进行初始化操作,使其具有初始值。在进行字符串二维数组初始化时,可以使用以下几种方式: 1. 直接赋值法:通过在数组声明时直接给出每个元素的初始值,用花括号{}包裹起来,每个元素之间用逗号分隔。例如: ``` String[][] strArray = {{"abc", "def"}, {"123", "456"}}; ``` 2. 逐个赋值法:通过逐个为数组中的每个元素进行赋值初始化。可以使用for循环来遍历数组,并为每个元素赋值。例如: ``` String[][] strArray = new String[2][2]; strArray[0][0] = "abc"; strArray[0][1] = "def"; strArray[1][0] = "123"; strArray[1][1] = "456"; ``` 3. 使用字符串数组的构造方法:可以使用字符串数组的构造方法来创建并初始化字符串二维数组。例如: ``` String[] array1 = {"abc", "def"}; String[] array2 = {"123", "456"}; String[][] strArray = {array1, array2}; ``` 无论使用哪种方式进行字符串二维数组初始化,最终都会得到一个包含指定初始值的二维数组。需要注意的是,二维数组中的每个元素都是一个字符串,因此在初始化时要保证每个元素的值都是合法的字符串,并且按照所需的规则进行排列组合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值