2013-09-23 1 views
1

J'ai une affectation où je dois taper la quantité de noms que je veux comparer. Ensuite, je dois voir si le prénom imprimé est répété dans les noms que j'ai imprimés. Par exemple si je mets 5 Reagan, Bush, Reagan, Bush, Clinton il imprimera "Le prénom a été répété" mais si je mets Davis pour l'un ou l'autre des Reagans il dirait non. J'ai essayé une boucle for et si des déclarations mais je n'arrive pas à trouver la bonne sortie. J'utilise Dev C++ et voici ce que j'ai jusqu'ici.Chaînes: Recherche si le premier mot est répété en utilisant strcmp

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() { 
    char curname[30], firstname[30]; 
    int num, i, freq = 1; 


    printf("How many names do you want to enter?\n"); 
    scanf("%d", &num); 
    printf("What is the first name?"); 
    scanf("%s", firstname); 
    printf("Enter each of their names.\n"); 
    for (i=0; i<num; i++) { 

     scanf("%s", curname); 

     if (i==0) { 
      strcmp(curname, firstname) != 0; 
      printf("The first name in the list was repeated.\n"); 
     } 
     else if (strcmp(curname, firstname) == 1) 
      printf("The first name in the list was not repeated.\n"); 
    } 
    system("pause"); 
    return 0; 
} 
+0

Cette ligne semble suspecte 'if (i == 0) {' car cela signifiera que la comparaison ne sera exécutée que pour le prénom entré. – miltonb

+0

Bienvenue dans Stack Overflow. Veuillez lire la page [About] bientôt. Vous avez étiqueté cette question avec C++, mais le code que vous montrez n'utilise aucune caractéristique distinctive de C++ et pourrait parfaitement être étiqueté comme C. À première vue, il semblerait que votre code ne compilera pas; c'est toujours un problème sérieux. Quoi qu'il en soit, il compile - mais votre placement des accolades étroites est très confus. Celui après le dernier 'printf()' termine réellement la boucle 'for'. S'il vous plaît aller et apprendre une disposition standard - style Allman ou l'OTBS (One True Brace Style). Vous pouvez rechercher ceux facilement. –

+0

@kaitlyn - J'ai édité votre mise en page, j'espère que vous pouvez voir ce que Jonathan fait remarquer au sujet de la mise en page. Une meilleure disposition évite les problèmes de logique. – miltonb

Répondre

0

Vous devez effectuer une seule comparaison et imprimer votre message en fonction du résultat de cette comparaison. Il est toujours utile d'être très clair sur la valeur de retour de tout appel de fonction, dans ce cas, strcmp.

+0

Lorsque vous dites être très clair sur la valeur de retour voulez-vous dire le retour 0; partie? Si oui, comment pourrais-je changer cela? Et merci! – Kaitlyn

+0

Je veux dire la valeur de code de retour strcmp, dans ce cas 0 indiquant que les chaînes sont les mêmes, mais généralement vous pouvez également trouver une autre fonction telle que strictmp. En d'autres termes, lisez le manuel :) – miltonb

0

strcmp valeur de retour peut être supérieure à 0 ou moins de 0, donc:

strcmp(curname, firstname) == 1 

changement:

strcmp(curname, firstname) != 0 

autres: Vous ne l'avez pas enregistrer les noms dans une liste, afin que vous puissiez ne trouve pas le nom s'il est répété ou non.

+0

J'ai fini par supprimer un ensemble d'accolades qui m'ont permis d'entrer les noms dans une liste. Malheureusement, je reçois toujours le mauvais message de sortie. Toute idée de comment résoudre ce problème? – Kaitlyn

0

vous devez comparer les noms, strcmpi est plus approprié (cas de comparaison insensible)

if (strcmpi(curname, firstname)==0) 
    printf("The first name in the list was repeated.\n"); 
else 
    printf("The first name in the list was not repeated.\n"); 
+0

Merci pour la suggestion, je vais en parler à mon professeur! :) Je vous remercie! – Kaitlyn

0

J'ai modifié mon programme en fonction des suggestions. Voici ce que j'ai maintenant. Cela me donnera seulement la sortie correcte si le nom est entré comme dernière valeur. Merci beaucoup!! :)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() { 
char curname[30], firstname[30]; 
int num, i, freq = 1; 

// Read in the number of students. 
printf("How many names do you want to enter?\n"); 
scanf("%d", &num); 
printf("What is the first name?\n"); 
scanf("%s", firstname); 
printf("Enter each of their names.\n"); 
for (i=0; i<num; i++) 

// Read the current name. 
scanf("%s", curname); 

// Always update the best seen for the first name. 
if (strcmp(firstname, curname)== 0) { 
    printf("The first name in the list was repeated.\n"); } 
else 
    printf("The first name in the list was not repeated.\n"); 
    system("pause"); 
    return 0; 
} 
Questions connexes