0
#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]);
}

所以问题是我有这个代码,由于某些原因 numbers[0] 与 number 相同。数字 [0] 不应该是前 50 个字符吗?我想不通。在此先感谢。

4

2 回答 2

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 ?
    }
于 2013-08-10T06:50:21.203 回答
3

您正在numbers[0]使用%s指令进行打印。这采用指向“字符串”的第一个字符的第一个char(即 type 的值)的地址:由 a 终止的 s序列。char *char'\0'

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

请注意,如果您将所有 50 chars 设置为非零值,则没有空间留给一个'\0'字节。您需要留出 51 chars 来保存 50 个 printable chars 和一个 final '\0'。或者,您可以使用 C 字符串以外的结构,例如计数数组(memcpymemcmp处理的东西),但除非您想'\0'在数组中允许字节,否则char这通常是太多的工作。

于 2013-08-10T06:56:27.073 回答