多维数组奇怪地行动

时间:2013-08-10 06:45:58

标签: c

#include <stdio.h>
#include <stdlib.h>
char number[5000]="37107287533902102798797998220837590246510135740250\
46376937677490009712648124896970078050417018260538\
.....more numbers.....";
char numbers[100][50];
main()
{
    int x,z;
    extern char numbers[100][50],number[5000];
    for(x=0;x<100;x++)
    {
        for(z=0;z<50;z++)
        {
            numbers[x][z]=number[50*x+z];
        }
    }
    printf("%s\n",numbers[0]);
}

所以事情是我有这个代码,并且由于某种原因,数字[0]与数字相同。是不是数字[0]应该是前50个字符。我无法弄清楚这一点。提前谢谢。

2 个答案:

答案 0 :(得分:5)

for(x=0;x<100;x++)
    {
        for(z=0;z<50;z++)
        {
            numbers[x][z]=number[50*x+z];
        }
    numbers[x][z+1] ='\0'; //Did you miss this ?
    }

答案 1 :(得分:3)

您正在使用numbers[0]指令打印%s。这将第一个char的地址(即类型char *的值)指向“字符串”的第一个字符:char的序列以{{{ 1}}。

'\0'数组包含50个非numbers[0] '\0' s,紧接其后(char)还有另一个非零numbers[1]。所以char不知道在哪里停下来。 (从技术上讲,当你将第一个数组的末尾运行到第二个数组时,这会导致未定义的行为,但实际上,C系统只会继续运行。)

请注意,如果将所有50 %s s设置为非零值,则char字节没有余地。您需要预留51 '\0'个来保存50个可打印的char和最后的char。或者,您可以使用C字符串以外的结构,例如count-array('\0'memcpy处理的事物),但除非您想允许memcmp字节在你的'\0'数组中,这通常太多了。