¿Cómo comparo correctamente las cadenas?

Estoy tratando de obtener un progtwig que permita a un usuario ingresar una palabra o carácter, almacenarlo y luego imprimirlo hasta que el usuario lo vuelva a escribir y salir del progtwig. Mi código se ve así:

#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; } 

El problema es que sigo recibiendo la impresión de la cadena de entrada, incluso cuando la entrada del usuario (verificación) coincide con la original (entrada). ¿Estoy comparando los dos incorrectamente?

No puede (de manera útil) comparar cadenas usando != O == , necesita usar strcmp :

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

La razón de esto es porque != Y == solo compararán las direcciones base de esas cadenas. No el contenido de las cuerdas en sí.

Ok algunas cosas: gets es inseguro y debería ser reemplazado por fgets(input, sizeof(input), stdin) para que no se produzca un desbordamiento de buffer.

Luego, para comparar cadenas, debe usar strcmp , donde un valor de retorno de 0 indica que las dos cadenas coinciden. El uso de los operadores de igualdad (es decir != ) Compara la dirección de las dos cadenas, a diferencia de las char individuales dentro de ellas.

Y también tenga en cuenta que, si bien en este ejemplo no causará problemas, fgets almacena el carácter de nueva línea, '\n' en los búferes también; gets() no. Si comparas la entrada del usuario de fgets() a un literal de cadena como "abc" , nunca coincidiría (a menos que el buffer fuera demasiado pequeño para que '\n' no encajara en él).

EDITAR: y golpeado por el súper rápido Mysticial una vez más.

No puede comparar matrices directamente como esta

 array1==array2 

Debes compararlos char-by-char; para esto puede usar una función y devolver un valor booleano (True: 1, False: 0). Entonces puede usarlo en la condición de prueba del ciclo while.

Prueba esto:

 #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 .

Esto está en la biblioteca string.h , y es muy popular. strcmp devuelve 0 si las cadenas son iguales. Vea esto para una mejor explicación de lo que devuelve strcmp .

Básicamente, tienes que hacer:

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

o

 while (!strcmp(check,input)) 

o

 while (strcmp(check,input)) 

Puede verificar esto , un tutorial sobre strcmp .

Siempre que intentes comparar las cuerdas, compáralas con respecto a cada personaje. Para esto puede usar una función de cadena incorporada llamada strcmp (input1, input2); y debe usar el archivo de encabezado llamado #include

Prueba 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"); } 

Lamentablemente no puede usar strcmp desde porque es un encabezado C ++ y específicamente dijo que es para una aplicación C. Tuve el mismo problema, así que tuve que escribir mi propia función 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 esto te sirva bien.

  #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 es una solución muy simple en la que obtendrá su resultado como lo desee.