我打算将字符串存储到指向字符串的指针数组中,然后按如下方式显示它们:
char *directions[3];
for(i=0;i<3;i++)
scanf("%s",directions[i]);
for(i=0;i<3;i++)
printf("%s",directions[i]);
但是当我运行此代码时,它会给我分段错误,有人可以帮我纠正吗?
答案 0 :(得分:4)
你有一个大小为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 ] );
}
答案 1 :(得分:2)
你所拥有的只是指向字符串的指针。在尝试使用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]);
答案 2 :(得分:0)
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 ]);
}