C语言中的字符串数组

C语言中的字符串数组,c,arrays,string,C,Arrays,String,我有一个字符串数组,当我遍历并打印它的元素时,它会给我意外的结果 char currencies[][3] = {"EUR", "GBP", "USD", "JPY", "CNY"}; void show_currencies() { int i; for(i=0; i<5; i++) { printf("%s - ", currencies[i]); } } 有人能解释这种行为吗 谢谢您缺少nul终止符,字符串实际上有4个字符长。然后,

我有一个字符串数组,当我遍历并打印它的元素时,它会给我意外的结果

char currencies[][3] = {"EUR", "GBP", "USD", "JPY", "CNY"};

void show_currencies()
{
    int i;
    for(i=0; i<5; i++)
    {
        printf("%s - ", currencies[i]);
    }
}
有人能解释这种行为吗


谢谢

您缺少nul终止符,字符串实际上有4个字符长。然后,每个字符串都会重写上一个字符串的空终止符*。请尝试:

char currencies[][4] = {"EUR", "GBP", "USD", "JPY", "CNY"}; 
*正如caf所指出的,这并不是“过度写入前一个字符串的空终止符”,因为空终止符从未复制到数组中。幸运的是,字符串在最后一个“-”之后没有乱码输出。

更改

char currencies[][3]

C中的字符串以NULL结尾,以便于处理(打印、复制等)。 示例:
charstr[]=“ABC”
将声明一个包含4个字符的字符串,并将
\0
作为最后一个字符(索引3)


作为一个提示,每当打印字符数组时,您会得到意外的结果,您可能需要检查字符数组是否以NULL结尾。

您声明它是错误的。这会奏效的。它只允许编译器设置指向常量字符的指针数组:

const char *currencies[] = {"EUR", "GBP", "USD", "JPY", "CNY"};

编辑:如果您为空数组分配空间,将其设置为二维数组,就像Charles Beattie的答案一样,也是可行的。另外,指定每个Christoph的字符是
const

当然。“EUR”有四个字符长——三个代表字母,一个代表终止的空字符。由于您显式指定了三个字符数组,编译器将截断,因此您的数据将串在一起。幸运的是,数组末尾显然有一个零字符,否则可能会得到各种各样的垃圾。将您的声明更改为
char currencies[][4]

我的C已经生锈了,请尝试:

char currencies[][3] = {"EUR\0", "GBP\0", "USD\0", "JPY\0", "CNY\0"};

我只是想知道会发生什么

你没有字符串数组,而是字符数组。您可以使用:

char* currencies[] = {"EUR", "GBP", "USD", "JPY", "CNY"};  // untested

允许不同长度的字符串。

是的-就是这样。。。您必须在数组中为空终止符和实际内容留出空间…ephemient,这不起作用(这是编译时错误)。您必须声明除最左边维度外的所有维度的大小(编译器必须知道一行处理索引的长度)。这是正确的,只是每个字符串没有“覆盖前一个字符串的null终止符”——nul终止符根本不会被写入,因为被初始化的数组每个只有3个字符。(很幸运,最后一个数组后面恰好有一个终止符)。实际上,这两种方法都可以工作(如果在原始代码中为终止零留出空间),但您的版本可能会更好,因为编译器将更容易对此进行优化;在这两种情况下,您都应该添加
const
限定符,尽管这两种声明不同。在OP的例子中,他声明了一个双字符数组,其中声明是一个常量字符指针数组。所以,在你的例子中,他不能修改数组的内容,我的意思是他不能做像货币[0][1]=“x”这样的事情;没错,查帕。看起来他并不打算修改它。编译器应该发出警告。同样的警告会出现,因为你的字符串有5个字符长<代码>“EUR\0”相当于{'E'、'U'、'R'、'\0'、'\0'}
任何一个合适的编译器都应该给出错误或至少警告this@chapper,@martani:我手头没有c标准的副本,但我认为在这种情况下,无声删除NUL字节是标准明确允许的。至少有一次,会有相当数量的代码使用这种技术初始化固定大小的字符数组,因为它比简单地逐个列出字符值要简洁得多。
char currencies[][3] = {"EUR\0", "GBP\0", "USD\0", "JPY\0", "CNY\0"};
char* currencies[] = {"EUR", "GBP", "USD", "JPY", "CNY"};  // untested