Como faço para comparar corretamente as seqüências de caracteres?

Eu estou tentando obter um programa para permitir que um usuário insira uma palavra ou caractere, armazene-o e imprima-o até que o usuário o digite novamente, saindo do programa. Meu código é assim:

#include  int main() { char input[40]; char check[40]; int i=0; printf("Hello!\nPlease enter a word or character:\n"); gets(input); printf("I will now repeat this until you type it back to me.\n"); while (check != input) { printf("%s\n", input); gets(check); } printf("Good bye!"); return 0; } 

O problema é que continuo recebendo a impressão da string de input, mesmo quando a input do usuário (check) coincide com a original (input). Estou comparando os dois incorretamente?

Você não pode (útil) comparar strings usando != Ou == , você precisa usar strcmp :

 while (strcmp(check,input) != 0) 

A razão para isso é porque != E != == só irá comparar os endereços base dessas cadeias. Não o conteúdo das cordas em si.

Ok algumas coisas: fgets(input, sizeof(input), stdin) não é seguro e deve ser substituído por fgets(input, sizeof(input), stdin) para que você não obtenha um estouro de buffer.

Em seguida, para comparar cadeias, você deve usar strcmp , em que um valor de retorno igual a 0 indica que as duas cadeias de caracteres correspondem. Usando os operadores de igualdade (ie. != ) Compara-se o endereço das duas cadeias de caracteres, em oposição aos char individuais dentro deles.

E também observe que, embora neste exemplo não cause problemas, o fgets armazena o caractere de nova linha, '\n' nos buffers também; gets() não. Se você comparasse a input do usuário de fgets() com um literal de string como "abc" ele nunca seria igual (a menos que o buffer fosse muito pequeno para que o '\n' não coubesse nele).

EDIT: e espancado pelo super rápido Mysticial mais uma vez.

Você não pode comparar matrizes diretamente assim

 array1==array2 

Você deve compará-los char-by-char; para isso você pode usar uma function e retornar um valor booleano (True: 1, False: 0). Então você pode usá-lo na condição de teste do loop while.

Tente isto:

 #include  int checker(char input[],char check[]); int main() { char input[40]; char check[40]; int i=0; printf("Hello!\nPlease enter a word or character:\n"); scanf("%s",input); printf("I will now repeat this until you type it back to me.\n"); scanf("%s",check); while (!checker(input,check)) { printf("%s\n", input); scanf("%s",check); } printf("Good bye!"); return 0; } int checker(char input[],char check[]) { int i,result=1; for(i=0; input[i]!='\0' || check[i]!='\0'; i++) { if(input[i] != check[i]) { result=0; break; } } return result; } 

Use strcmp .

Isso está na biblioteca string.h e é muito popular. strcmp return 0 se as strings forem iguais. Veja isto para uma melhor explicação do que strcmp retorna.

Basicamente, você tem que fazer:

 while (strcmp(check,input) != 0) 

ou

 while (!strcmp(check,input)) 

ou

 while (strcmp(check,input)) 

Você pode verificar isso , um tutorial sobre strcmp .

Sempre que você estiver tentando comparar as strings, compare-as em relação a cada caractere. Para isso, você pode usar a function de string interna chamada strcmp (input1, input2); e você deve usar o arquivo de header chamado #include

Experimente este código:

 #include #include #include int main() { char s[]="STACKOVERFLOW"; char s1[200]; printf("Enter the string to be checked\n");//enter the input string scanf("%s",s1); if(strcmp(s,s1)==0)//compare both the strings { printf("Both the Strings match\n"); } else { printf("Entered String does not match\n"); } system("pause"); } 

Infelizmente você não pode usar strcmp de porque é um header C ++ e você especificamente disse que é para um aplicativo C. Eu tive o mesmo problema, então eu tive que escrever minha própria function que implementa strcmp :

 int strcmp(char input[], char check[]) { for (int i = 0;; i++) { if (input[i] == '\0' && check[i] == '\0') { break; } else if (input[i] == '\0' && check[i] != '\0') { return 1; } else if (input[i] != '\0' && check[i] == '\0') { return -1; } else if (input[i] > check[i]) { return 1; } else if (input[i] < check[i]) { return -1; } else { // characters are the same - continue and check next } } return 0; } 

Espero que isso sirva bem a você.

  #include #include int main() { char s1[50],s2[50]; printf("Enter the character of strings: "); gets(s1); printf("\nEnter different character of string to repeat: \n"); while(strcmp(s1,s2)) { printf("%s\n",s1); gets(s2); } return 0; } 

Esta é uma solução muito simples em que você terá sua saída como você deseja.