2016-05-15 5 views
5

Mon programme a besoin de ces fonctionnalités:Erreur dans strcmp() lorsque j'utilise une structure en tant que paramètre

NOTE: Je ne comprend pas les codes pour les numéros 1,2 & 4 depuis je les ai déjà fini. Le 3ème est mon problème.

  1. Le programme devrait permettre en permanence l'entrée de l'utilisateur aussi longtemps que l'utilisateur le souhaite. (Dynamiquement)
  2. Obtenir la note finale d'un étudiant (moyenne de frst_grade, scnd_grade, fnl_grade)
  3. Obtenez le nombre d'étudiants par collège.
  4. Obtenez le nom de l'élève en entrant s_id.

Mon problème est de savoir comment comparer l'entrée de recherche à l'entrée de l'utilisateur dans s_college pour obtenir le nombre d'étudiants. La seule façon dont je sais est en utilisant strcmp() mais il me donne cette erreur: conversion invalide de 'char' en 'const char *' [-fpermissive]

Alors comment puis-je comparer ces deux pour obtenir le nombre de étudiants par collège?

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

int i,n,sum,search,num=0,ctr=0; 

char answer,choice,choice2,search2; 

struct record{ 

int s_id; 
char s_name[100]; 
char s_course; 
char s_college[5]; 
int s_scoress; 
}id[100],name[100],course,college[100],scores; 

struct s_scores{ 
int frst_grade; 
int scnd_grade; 
int fnl_grade; 
}first,second,final; 



void ADD(); 
void COLLEGE(); 
void ID(); 


void COLLEGE(){ 
printf("Enter college (abbreviation only)"); 
scanf("%s",&search2); 
for(i=0;i<num;i++){ 
if(strcmp(college[i].s_college,search2)==0); 
ctr++;  
} 
printf("The number of students in %s is %d",search2,ctr); 
+1

Votre' search2' est un 'char' et non une chaîne. Corrige le. – Ouss4

+1

Augmentez le niveau d'avertissement de votre compilateur au maximum, puis corrigez le code jusqu'à ce que plus aucun avertissement ne soit émis. Ce "*' char search2; ... strcmp (..., search2) '*" devrait faire en sorte que le compilateur vous envoie un avertissement. Prenez des avertissements sérieux. – alk

+1

Avez-vous par hasard un fichier de données dont vous êtes censé lire les valeurs? Si tel est le cas, cela serait également nécessaire ici pour prendre en charge des tests valides. –

Répondre

7

permet de jeter un oeil à ces lignes (partielles):

char ..., search2; 
... 
scanf("%s",&search2); 
... 
...strcmp(college[i].s_college,search2)... 

La variable search2 est une caractère unique. Essayer d'y insérer une chaîne écrira au moins deux caractères: la chaîne que vous lisez plus la terminaison de la chaîne. Cela signifie que vous allez écrire hors limites.

Vous utilisez ensuite la variable de caractère comme argument à strcmp qui convertit le contenu de search2 en pointeur et utilise ce pointeur comme un pointeur vers une chaîne.

Ces deux problèmes conduiront à un comportement non défini . Est-ce que search2 est censé être une chaîne?Puis le déclarer comme un tableau , comme

char ..., search2[100]; 

Si search2 est censé être un seul caractère alors vous devez d'abord lire un seul caractère

scanf("%c", &search2); // Note the changed format to read a single character 

Et vous devez changer votre comparaison de ne pas utiliser strcmp.

+0

Je n'ai pas remarqué que ma search2 n'est pas déclarée comme un tableau. Maintenant, tout mon programme fonctionne. Merci beaucoup! –

+3

@JoseG .: "* n'a pas vraiment remarqué *" C'est pourquoi vous devriez prendre les avertissements de votre compilateur si sérieux! Ils déboguent gratuitement! :-) – alk

5

Vous ne pouvez pas utiliser strcmp avec ce qui est pas une chaîne terminée par zéro. Vous pouvez écrire

if(college[i].s_college[0] == search2 && college[i].s_college[1] == '\0') 

Ne pas oublier de retirer le point-virgule indésirable pour avoir le travail de déclaration if.

+0

Bonne solution. Il ne mentionne cependant pas de changer 'scanf ("% s ", & search2);' devenir 'scanf ("% c ", & search2);' pour que le code fonctionne. – alk

5

Votre search2 est juste un personnage. Vous avez besoin d'une chaîne

déclarer Peut-être search2 comme suit:

char search2[50]; 

lire également environ scanf pour éviter les dépassements de mémoire tampon:

scanf("%49s", search2); // Do not go past the end of search2[50] 
1

Bien le compilateur vous indique l'erreur: La variable search2 est char tandis que s_college[5]; est un tableau de caractères. La fonction strcmp requiert deux tableaux/pointeurs pour fonctionner.

Si search2 est seulement un octet alors vous pouvez créer: char Search2[2]; qui contiendrait un seul caractère et terminal null. Mais cela ne fonctionnerait que si search2 est un octet. Si vous devez cependant comparer deux tableaux de caractères où search2 est plus d'un octet, alors vous devriez probablement penser à allocation dynamique ou créer un tableau statique char search2[some_length];.

+0

"* Mais cela ne fonctionnerait que si search2 est un octet. *" Encore pas ça. C- "string" s sont terminés par "0". Donc 'char s [1];' serait juste capable de contenir la chaîne vide '" "'. – alk

+0

Vous avez raison, je vais modifier. –

-2

Déclarez search2 comme char search2 [10]; ou char * search2;

Raison: string2 est une variable de caractère et college est un tableau de caractères de terminaison null.

Signature de l'identifiant stncmp int int strcmp (const char * s1, const char * s2);

Donc la fonction pour correctement vous devez passer char * ou char array (qui est encore un char *).

+1

"* ... ou' char * search2; "*" non, non. – alk

1

ce n'est pas une complète « réponse », cependant, il ne résout certains des problèmes majeurs dans le code:

Définir vos struct est comme ça;

struct s_scores 
{ 
    int frst_grade; 
    int scnd_grade; 
    int fnl_grade; 
}; 


struct record 
{ 
    int s_id; 
    char s_name[100]; 
    char s_course; 
    char s_college[5]; 
    struct s_scores s_scoress; 
}; 

struct record records[100]; 

accéder ensuite les champs individuels similaires à:

if(1 != scanf("%4s", records[i].s_college)) 
{ 
    perror("scanf for college abbreviation failed"); 
    exit(EXIT_FAILURE) 
} 

// implied else, scanf successful 

// validate the college abbreviation 

for(size_t j=0; j< (sizeof(collegesAbbrevationsTable)/(sizeof(*collegeAbbreviationsTable); i++) 
{ 
    if(strncmp(collegeAbbreviationsTable[j], records[i].s_college, 4) 
    { // then found matching abbreviation 
     break; // exit 'validation' loop 
    } 
} 

Remarque: perror() trouvés dans stdio.h. exit() et EXIT_FAILURE trouvé dans stdlib.h.

Remarque: C, lors du référencement d'un tableau, le résultat est un pointeur vers le premier octet de ladite matrice, de sorte que dans l'appel à scanf() ne doit pas utiliser & lors du référencement du réseau s_college[].

`