用c语言打印字符串数组



这是C语言中的字符串数组。我试着打印这些元素,但是程序不打印它们。代码中的错误是什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char day[7]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};

printf("%sn", day[0]);
}
语句
char day[7];

声明了一个chars数组,它只能容纳7个字节(如果是字符串的话,包括空终止符),而不是7个长度不确定的字符串。

您可以声明一个指向charchar *s的指针数组,其中每个指针指向内存中的chars序列。

const char *day[7] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
在内存中,它看起来像这样:
--------------------------------------
day[0] -> | "Saturday"
--------------------------------------
day[1] -> | "Sunday"
--------------------------------------
day[2] -> | "Monday"
--------------------------------------
day[3] -> | "Tuesday"
--------------------------------------
day[4] -> | "Wednesday"
--------------------------------------
day[5] -> | "Thursday"
--------------------------------------
day[6] -> | "Friday"
--------------------------------------

由于day是一个指针数组,你可以使它的元素(即指针)指向内存中的其他地方,但你不能改变字符串字面量本身。

此声明

char day[7]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};

是无效的。

没有声明字符串数组。声明了一个由7个字符组成的数组,这些字符由字符串字面值的地址初始化。

编译器应该发出一个相对于此声明的消息,因为没有从类型char *(初始化表达式的类型)到类型char的隐式转换。

相反,您应该声明一个一维指针数组,如
char * day[7] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};

或者更像

const char * day[7] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};

因为你不能改变字符串字面值(尽管在C中与c++相反的字符串字面值有非常量字符数组的类型)

在这些声明中,具有数组类型的字符串被隐式地转换为指向其第一个字符的指针。

或者像

这样的二维数组
char day[7][10] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};

在此声明中,所有字符(包括字符串字面值的结束零字符'')都用于显式初始化所声明数组的元素。数组中没有相应的显式初始化式的所有字符将被零初始化。

最新更新