【发布时间】:2010-08-18 03:13:58
【问题描述】:
我打算将字符串存储到一个指向字符串的指针数组中,然后将它们显示如下:
char *directions[3];
for(i=0;i<3;i++)
scanf("%s",directions[i]);
for(i=0;i<3;i++)
printf("%s",directions[i]);
但是当我运行这段代码时,它给了我分段错误,有人可以纠正我吗?
【问题讨论】:
我打算将字符串存储到一个指向字符串的指针数组中,然后将它们显示如下:
char *directions[3];
for(i=0;i<3;i++)
scanf("%s",directions[i]);
for(i=0;i<3;i++)
printf("%s",directions[i]);
但是当我运行这段代码时,它给了我分段错误,有人可以纠正我吗?
【问题讨论】:
你有一个大小为 3 的字符指针数组。这些指针不指向任何有效内存,您可能会在其中存储您正在读取的一些字符串。尝试写入无效内存会调用 UB。在这里,UB 以分段错误的形式出现(很可能是因为您试图写入您无法控制的位置)。
先尝试分配一些内存:说一个足够大的缓冲区以读取整行(或您认为会遇到的最大字符串)。读入,分配一个direction数组成员,然后复制出来如下:
char *directions[ 3 ];
const MAX_LINE_SIZE = 256;
char line[ MAX_LINE_SIZE ];
for (size_t nstr = 0; nstr < 3; ++nstr) {
if (fgets( line, MAX_LINE_SIZE, stdin ) != NULL) {
directions[ nstr ] = malloc( strlen( line ) );
strcpy( directions[ nstr ], line );
}
printf( "%s\n", directions[ nstr ] );
}
【讨论】:
switch。 case 标签必须在编译时可评估。您可以使用integral constant expressions,即整数类型和/或枚举。对于字符串,您可以使用传统的if-else。
if 是复制粘贴错误:P BTW:fgets 的大小参数包括空终止符。
你所拥有的只是指向字符串的指针。在尝试使用scanf 进行读取之前,您需要使这些指针指向有效的内存位置。
// allocate memory.
for(i=0;i<3;i++)
directions[i] = (char*)malloc(sizeof(char) * SUITABLE_MAX);
// now read.
for(i=0;i<3;i++)
scanf("%s",directions[i]);
【讨论】:
sizeof(char) == 1 根据定义,因此被乘数是多余的。
char *directions[ 3 ];
const MAX_LINE_SIZE = 256;
char line[ MAX_LINE_SIZE ];
for (size_t nstr = 0; nstr < 3 && fgets( line, MAX_LINE_SIZE, stdin ); ++nstr) {
strcpy(directions[ nstr ] = malloc( strlen( line )+1 ),line);
puts(directions[ nstr ]);
}
【讨论】: