将字符串作为输入放入指向字符串的指针数组并显示它们

时间:2010-08-18 03:13:59

标签: c arrays pointers string

我打算将字符串存储到指向字符串的指针数组中,然后按如下方式显示它们:

char *directions[3]; for(i=0;i<3;i++) scanf("%s",directions[i]); for(i=0;i<3;i++) printf("%s",directions[i]);

但是当我运行此代码时,它会给我分段错误,有人可以帮我纠正吗?

3 个答案:

答案 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 ]);
}