Опитвам се да накарам една програма да позволи на потребителя да въведе дума или символ, да го съхрани и след това да го отпечата, докато потребителят не го въведе отново и не излезе от програмата. Кодът ми изглежда по следния начин:
#include <stdio.h>
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;
}
Проблемът е, че продължавам да получавам отпечатване на входния низ, дори когато въведеното от потребителя (check) съвпада с оригиналното (input). Дали не сравнявам двете неправилно?
Не можете да сравнявате низове с помощта на !=
или ==
, а трябва да използвате strcmp
:
while (strcmp(check,input) != 0)
Причината за това е, че !=
и ==
ще сравняват само базовите адреси на тези низове. Не сравняват съдържанието на самите низове.
Добре, няколко неща: gets
е опасно и трябва да се замени с fgets(input, sizeof(input), stdin)
, за да не се получи препълване на буфера.
След това, за да сравнявате низове, трябва да използвате strcmp
, където връщане на стойност 0 означава, че двата низа съвпадат. Използването на операторите за равенство (т.е. !=
) сравнява адреса на двата низа, а не отделните `символи в тях.
И също така обърнете внимание, че макар в този пример това да не предизвиква проблем, fgets
съхранява символа за нов ред, '\n'
в буферите; gets()
не го съхранява. Ако сравнявате потребителския вход от fgets()
с литерален низ като "abc"
, той никога няма да съвпадне (освен ако буферът не е твърде малък, така че '\n'
няма да се побере в него).
EDIT: и отново победен от супербързия Mysticial.
Не можете да сравнявате директно масиви по следния начин
array1==array2
Трябва да ги сравнявате символ по символ; за тази цел можете да използвате функция и да върнете булева стойност (True:1, False:0). След това можете да я използвате в тестовото условие на цикъла while.
Опитайте това:
#include <stdio.h>
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;
}