我试图得到一个程序,让用户输入一个单词或字符,存储它,然后打印它,直到用户再次键入它,退出程序。我的代码是这样的:

#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);   /* obsolete function: do not use!! */
    printf("I will now repeat this until you type it back to me.\n");

    while (check != input)
    {
        printf("%s\n", input);
        gets(check);   /* obsolete function: do not use!! */
    }

    printf("Good bye!");
    

    return 0;
}

问题是,我一直得到输入字符串的打印,即使当用户的输入(检查)匹配原始(输入)。我把两者比较错了吗?


当前回答

我如何正确比较字符串?

char input[40];
char check[40];
strcpy(input, "Hello"); // input assigned somehow
strcpy(check, "Hello"); // check assigned somehow

// insufficient
while (check != input)

// good
while (strcmp(check, input) != 0)
// or 
while (strcmp(check, input))

让我们深入挖掘,看看为什么check !=输入不充分。

在C语言中,string是标准库规范。

字符串是一个连续的字符序列,以第一个空字符结束并包含第一个空字符。 C11§7.1.1

上面的输入不是字符串。输入是char类型的数组40。

输入的内容可以变成字符串。

在大多数情况下,在表达式中使用数组时,数组会转换为其第一个元素的地址。

下面的代码将检查和输入转换为第一个元素各自的地址,然后比较这些地址。

check != input   // Compare addresses, not the contents of what addresses reference

为了比较字符串,我们需要使用这些地址,然后查看它们所指向的数据。 Strcmp()完成这项工作。§7.23.4.2

Int strcmp(const char *s1, const char *s2); strcmp函数的作用是比较s1指向的字符串和s2指向的字符串。 strcmp函数返回一个大于、等于或小于零的整数, 因此,s1所指向的字符串大于、等于或小于s2所指向的字符串。

代码不仅可以发现字符串是否属于相同的数据,还可以发现当字符串不同时,哪个字符串更大或更小。

当字符串不同时,下面为真。

strcmp(check, input) != 0

有关详细信息,请参见创建自己的strcmp()函数

其他回答

当您尝试比较字符串时,请将它们与每个字符进行比较。为此,你可以使用内置的字符串函数strcmp(input1,input2);你应该使用名为#include<string.h>的头文件

试试下面的代码:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h>  

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

使用比较字符串。

它在string.h库中,非常流行。如果字符串相等,STRCMP返回0。下面是strcmp返回内容的更好解释。

基本上,你需要做的是:

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

or

while (!strcmp(check,input))

or

while (strcmp(check,input))

您可以查看这个关于strcmp的教程。

你不能像这样直接比较数组

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

我如何正确比较字符串?

char input[40];
char check[40];
strcpy(input, "Hello"); // input assigned somehow
strcpy(check, "Hello"); // check assigned somehow

// insufficient
while (check != input)

// good
while (strcmp(check, input) != 0)
// or 
while (strcmp(check, input))

让我们深入挖掘,看看为什么check !=输入不充分。

在C语言中,string是标准库规范。

字符串是一个连续的字符序列,以第一个空字符结束并包含第一个空字符。 C11§7.1.1

上面的输入不是字符串。输入是char类型的数组40。

输入的内容可以变成字符串。

在大多数情况下,在表达式中使用数组时,数组会转换为其第一个元素的地址。

下面的代码将检查和输入转换为第一个元素各自的地址,然后比较这些地址。

check != input   // Compare addresses, not the contents of what addresses reference

为了比较字符串,我们需要使用这些地址,然后查看它们所指向的数据。 Strcmp()完成这项工作。§7.23.4.2

Int strcmp(const char *s1, const char *s2); strcmp函数的作用是比较s1指向的字符串和s2指向的字符串。 strcmp函数返回一个大于、等于或小于零的整数, 因此,s1所指向的字符串大于、等于或小于s2所指向的字符串。

代码不仅可以发现字符串是否属于相同的数据,还可以发现当字符串不同时,哪个字符串更大或更小。

当字符串不同时,下面为真。

strcmp(check, input) != 0

有关详细信息,请参见创建自己的strcmp()函数

好的,一些事情,gets是不安全的,应该替换为fgets(input, sizeof(input), stdin)这样你就不会得到缓冲区溢出。

接下来,要比较字符串,必须使用strcmp,其中返回值为0表示两个字符串匹配。使用相等操作符(即。!=)比较两个字符串的地址,而不是它们内部的单个字符。

还要注意,虽然在这个例子中它不会引起问题,但fgets也将换行符'\n'存储在缓冲区中;Gets()不会。如果你比较来自fgets()的用户输入和一个字符串字面值,比如“abc”,它永远不会匹配(除非缓冲区太小,以至于'\n'不能装进去)。