2013-09-23 3 views
1

У меня есть задание, в котором я должен ввести количество имен, которые я хочу сравнить. Затем я должен проверить, повторяется ли первое имя в именах, которые я напечатал. Например, если я ставлю в 5 Рейгана, Буша, Рейгана, Буша, Клинтона, он напечатает «Первое имя повторилось», но если я поставлю Дэвиса для любого из рейганов, это скажет «нет». Я попытался создать цикл for и if, но я не могу найти правильный вывод. Я использую Dev C++, и вот что я до сих пор.Строки: поиск повторения первого слова с использованием 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

Эта строка кажется подозрительной 'if (i == 0) {', поскольку это будет означать, что сравнение выполняется только для введенного имени. – miltonb

+0

Добро пожаловать в переполнение стека. Вскоре прочитайте страницу [О программе]. Вы отметили этот вопрос с помощью C++, но код, который вы показываете, не использует каких-либо отличительных особенностей C++ вообще и вполне может быть помечен как C. На первый взгляд, похоже, что ваш код не будет компилироваться; это всегда серьезная проблема. _However_, он компилируется, но ваше размещение близких брекетов очень сбивает с толку. Тот, который после последнего 'printf()' фактически завершает цикл 'for'. Пожалуйста, изучите стандартный макет - стиль Allman или OTBS (один True Brace Style). Вы можете найти их достаточно легко. –

+0

@kaitlyn - Я отредактировал ваш макет, надеюсь, вы увидите, что Джонатан указывает на макет. Лучшая компоновка позволяет избежать логических проблем. – miltonb

ответ

0

Вам необходимо сделать только одно сравнение и распечатать свое сообщение, основываясь на результате этого сравнения.

if (strcmp(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"); 
    } 

Его всегда стоит быть предельно ясным, на что обратное значение любого вызова функции, в данном случае strcmp.

+0

Когда вы говорите, что очень четко сказано о возвращаемом значении, вы имеете в виду возврат 0; часть? Если да, то как я могу это изменить? И благодарю вас! – Kaitlyn

+0

Я имею в виду значение кода возврата strcmp, в этом случае 0 указывает, что строки одинаковы, но обычно вы также можете найти альтернативную функцию, такую ​​как stricmp. Другими словами, прочитайте руководство :) – miltonb

0

strcmp возвращаемого значения может быть больше 0 или меньше 0, так:

strcmp(curname, firstname) == 1 

изменения:

strcmp(curname, firstname) != 0 

другие: Вы не записывали имена в список, так что вы можете не находите имя, если оно или не повторялось.

+0

В итоге я удалил набор фигурных скобок, которые позволили мне ввести имена в список. К сожалению, я все еще получаю неправильное выходное сообщение. Любая идея, как это исправить? – Kaitlyn

0

вы должны сравнить имена, strcmpi больше подходит (чувствительно к регистру сравнение)

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

Спасибо за предложение, я поговорю с моим учителем об этом! :) Спасибо! – Kaitlyn

0

Так я редактировал свою программу на основе предложений. Вот что у меня есть сейчас. Это даст мне правильный результат, если имя введено как последнее значение. Огромное спасибо!! :)

#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; 
} 
Смежные вопросы