2012-12-08 101 views
-1

我试图在字符串中使用下划线,但它似乎使编译器将更少的字节分配给char数组并在关闭的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: 
[email protected]:~/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: 
[email protected]:~/test$ ./test 
aaaa 
bbbb_bcccc 
cccc 
dddd 
ffff_feeee 
eeee 
+0

Welp。这不符合你的想法。而且,下划线几乎是错误的。 “这是一个编译器错误” - 事实并非如此。 – 2012-12-08 13:25:59

+0

(地球上如何获得2 upvotes?) – 2012-12-08 13:30:32

回答

4

在你的代码ARRSIZE没有确定阵列的大小而是每个单独子阵列的大小。所以你要告诉它存储bbbb_bbbb在6个字符。也许你可以存储指向代替:

const char *str_ex[] = {....}; 
0

ARRSIZE是指分配给每个字符串的字符数。问题是ARRSIZE6,而"bbbb_bbbb""ffff_ffff"都长于六个字符。下划线是无关紧要的。

2

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

您应该把这个声明为指针数组,这样

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"}; 
1

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

1

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

1

您正在设置错误的尺寸。 试试这个:

char *str_ex[ARRSIZE] = .... 

这工作,因为你初始化C字符串与静态数据的阵列。

相关问题