Ошибка строки / сегментации - PullRequest
0 голосов
/ 25 февраля 2011
/*                                                                           
  Program to calculate trip and plan flights                                 
*/
#define TRIP 6
#define NAMEMAX 40
#define DEST 1

#include <stdio.h>
#include <string.h>


int main(void)
{
  int i, trip_num, row, col;
  char travel_name[TRIP][DEST],
    dest_in[1];


  printf("Please enter the number of trips:");
  scanf("%d", &trip_num);

  while (trip_num > TRIP)
    {
      printf("Invalid number of trip. (Min of 3 trips and Max 6 trips).\n");\
  /*input number of trips*/
      printf("Please enter the number of trips:");
      scanf("%d", &trip_num);
      if (trip_num < TRIP)
        printf("Valid trip number. Please proceed to enter destination code.\
\n");
    }

  for (i=0; i < trip_num ; i++)

    {
      printf("Please enter name of destination(Note: use _ to for spaces in \
name):\n");
      scanf("%s", &dest_in);
      if (strlen(dest_in) < NAMEMAX)
        strcpy(travel_name[i],dest_in);
   /*   else (strlen(dest_in) > NAMEMAX) */



  for (row = 0; row < trip_num; row++)
    {
      for (col=0; col < DEST; col++)
        printf("Trip#:%d travel_name:%s \n", row+1, travel_name[row][col]);
    }

  return 0;
}

Я пытаюсь заставить пользователя ввести имя в виде строки и сохранить его, если имя не более 40 символов, но из-за ошибки сегментации

Ответы [ 3 ]

3 голосов
/ 25 февраля 2011

trip_num не инициализируется. Неизвестно, сколько раз цикл for выполняется так:

travel_name[i][0]=dest_in[100];

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

1 голос
/ 25 февраля 2011

Есть много проблем с вашим кодом.

  1. scanf("%s", &dest_in) будет читать строку в dest_in, которая потенциально может переполнить ваш буфер, потому что нет спецификатора размера Попробуйте изменить его на scanf("%99s", dest_in), чтобы вы прочитали максимум 99 символов, + 1 для нулевого терминатора, равного 100 (размер вашего массива). Кроме того, здесь нет необходимости использовать оператор &.

  2. travel_name[i][0]=dest_in[100]; Вы получаете доступ к персонажу, который находится за пределами dest_in. Единственный индекс, к которому вы должны получить доступ - это 0.

  3. printf("Trip#:%d travel_name:%s \n", row+1, travel_name[row][col]); Ваш код говорит, что вы хотите напечатать строку. printf ищет указатель на массив символов, но travel_name[row][col] это один символ.

  4. while (trip_num > TRIP). Вы говорите пользователю ввести число от 3 до 6, но вы не проверяете, является ли ввод меньше 3.

0 голосов
/ 25 февраля 2011

Я думаю, это потому что -> Что такое trip_num?

Эти типы проблем могут быть легко решены с помощью отладчика. Могу ли я предложить обучение gdb (или cgdb) или, возможно, прямой IDE со встроенными возможностями отладки, такими как Eclipse CDT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...