Взятие строк в качестве входных данных в массив указателей на строки и их отображение - PullRequest
1 голос
/ 18 августа 2010

Я намереваюсь сохранить строки в массиве указателей на строки и затем отобразить их следующим образом:

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

, но когда я запускаю этот код, это вызывает ошибку сегментации,Может кто-нибудь, пожалуйста, поправьте меня?

Ответы [ 3 ]

4 голосов
/ 18 августа 2010

У вас есть массив размером 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 ] );
}
2 голосов
/ 18 августа 2010

Все, что у вас есть, это указатели на строку.Вам нужно сделать так, чтобы эти указатели указывали на допустимые области памяти, прежде чем пытаться читать, используя 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]);
0 голосов
/ 18 августа 2010
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 ]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...