2011-02-25 7 views
-2
/*                   
    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; 
} 

Je suis en train de faire à l'utilisateur de mettre un nom en tant que chaîne et stocker si le nom est de 40 caractères ou moins, mais sa me donner une erreur de segmentationChaîne/erreur de segmentation

+1

> travel_name [i] [0] = dest_in [100]; <- Je ne sais pas ce qui est prévu ici, mais dest_in [100] n'est pas un index valide. – Kevin

Répondre

1

Il y a beaucoup de problèmes avec votre code.

  1. scanf("%s", &dest_in) lit une chaîne en dest_in qui pourrait déborder votre tampon, car il n'y a pas de spécificateur taille. Pensez à le changer en scanf("%99s", dest_in) afin de lire 99 caractères maximum, + 1 pour le terminateur null qui est 100 (la taille de votre tableau). De plus, il n'est pas nécessaire d'utiliser l'opérateur & ici.

  2. travel_name[i][0]=dest_in[100]; Vous accédez à un caractère situé en dehors des limites de dest_in. Le seul index auquel vous devez accéder est 0.

  3. printf("Trip#:%d travel_name:%s \n", row+1, travel_name[row][col]); Votre code indique que vous souhaitez imprimer une chaîne. printf recherche un pointeur vers un tableau de caractères mais travel_name[row][col] est un caractère unique.

  4. while (trip_num > TRIP). Vous dites à l'utilisateur d'entrer un nombre entre 3 et 6, mais vous ne cochez pas si l'entrée est inférieure à 3.

+0

pour le voyage num Je n'utilisais que 1 de sorte que je peux juste vérifier pour voir si elle charge (je sais son bâclée) quant à la scanf quand mon intention était juste de scanner un personnage qui était de 40 longueur je réédite le code mais pour une raison quelconque quand j'entre un nom il imprime seulement la première lettre –

3

trip_num n'est pas initialisé. On ne sait pas combien de fois la boucle exécute alors:

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

pourrait être écrit après la fin du tableau. Aussi, quel est le but de cette déclaration? Je ne suis pas vraiment ce qu'il essaie de faire, alors je commencerais par comprendre cela.

+0

oublié de copier la partie supérieure du code, il était censé scanner trip_num trip_num <6 –

0

Je pense que c'est parce que -> Qu'est-ce que trip_num?

Ces types de problèmes peuvent être facilement résolus grâce à l'utilisation d'un débogueur. Puis-je suggérer apprendre gdb (ou cgdb) ou peut-être un IDE pure avec des capacités de débogage intégrées comme Eclipse CDT.