-2

我尝试在字符串中使用下划线,但它似乎使编译器为 char 数组分配更少的字节并在结束字符 ('\0') 上运行。

是什么原因造成的?有没有办法逃避下划线字符?

谢谢。

有关更多信息,请参阅此代码:

code:
#include<stdio.h>
#define ARRSIZE 6

char str_ex[][ARRSIZE] = {"aaaa", "bbbb_bbbb", "cccc", "dddd", "ffff_ffff", "eeee"};

int main(void)
{
    int i;
    for(i=0; i<ARRSIZE; i++)
        printf("%s\n", str_ex[i]);
    return 0;
}

compile:
user@ubuntu:~/test$ gcc -g test.c -o test -Wall -ansi
test.c:4:1: warning: initializer-string for array of chars is too long [enabled by default]
test.c:4:1: warning: (near initialization for ‘str_ex[1]’) [enabled by default]
test.c:4:1: warning: initializer-string for array of chars is too long [enabled by default]
test.c:4:1: warning: (near initialization for ‘str_ex[4]’) [enabled by default]

output:
user@ubuntu:~/test$ ./test
aaaa
bbbb_bcccc
cccc
dddd
ffff_feeee
eeee
4

6 回答 6

4

在您的代码ARRSIZE中,不会确定数组的大小,而是确定每个单独的子数组的大小。所以你告诉它以bbbb_bbbb6 个字符存储。也许你可以存储指针:

const char *str_ex[] = {....};
于 2012-12-08T13:25:30.387 回答
3

这不是因为下划线,而是因为您调整数组大小的方式:您将元素限制为六个字符,并且带有下划线的元素是唯一超过该长度的元素;其他四个字符串只需要五个chars,因此它们适合大小为 6 的元素。

您应该将其声明为指针数组,如下所示

char *str_ex[ARRSIZE] = {"aaaa", "bbbb_bbbb", "cccc", "dddd", "ffff_ffff", "eeee"};

或者给你的字符串更多的空间,像这样:

char str_ex[10][ARRSIZE] = {"aaaa", "bbbb_bbbb", "cccc", "dddd", "ffff_ffff", "eeee"};
于 2012-12-08T13:25:29.863 回答
1

每个字符串的长度最多应为 ARRSIZE 个字符,但带下划线的字符串更大。

于 2012-12-08T13:27:16.713 回答
1

您设置了错误的尺寸。尝试这个:

char *str_ex[ARRSIZE] = ....

这将起作用,因为您使用静态数据初始化 C 字符串数组。

于 2012-12-08T13:31:15.433 回答
1

您声明str_ex为一个数组数组,每个子数组为 6 个字符,这意味着字符串只能是 5 个字符(加上终止符'\0')。您有几个长度超过 5 个字符的字符串,这是编译器警告的内容。

于 2012-12-08T13:25:39.430 回答
0

ARRSIZE指为每个字符串分配的字符数。问题是ARRSIZE,6而两者"bbbb_bbbb""ffff_ffff"都超过六个字符。下划线无关紧要。

于 2012-12-08T13:25:20.873 回答