C

时间:2018-08-14 19:20:45

标签: c strcmp

我正在使用strcmp()功能来测试其工作方式。

好的,有strcmp(string1,string2)表示我们的string1比string2大或小。

这是我测试此功能的代码:

#include<stdio.h>
#include<string.h>
 char string1[20];
 char string2[20];
int main()
{
    int test;

    printf("Enter 'string1'\n");
    scanf("%s",&string1);
    printf("Enter 'string2'\n");
    scanf("%s",&string2);

    test=strcmp(string1,string2);

    if(test>0)
        printf("String 'string1' is greater than 'string2'\n");
    else if(test<0)
        printf("String 'string1' is less than 'string2'\n");
    else if(test==0)
        printf("\n String 'string1'is equal to 'string2'");

        printf("\n The value of 'test' is :%d",test);

        return 0;
}

测试变量始终为1,并且'string1'始终大于'string2'。 请帮助

3 个答案:

答案 0 :(得分:1)

strcmp不太可能是问题所在。您可以采取一些措施来解决问题。

  1. 使用scanf时请确保防止溢出。
  2. 确保对scanf的调用成功。
  3. 添加一行代码以打印读取的内容,以便您知道将值传递给strcmp
  4. 您不需要使用&string1来读取字符串。仅使用string1。与string2相同。

printf("Enter 'string1'\n");

// Read at most 19 characters from the stream, leaving space
// for the null terminator.

if ( scanf("%19s", string1) != 1 )
{
   // Problem reading into string1.
   printf("Unable to read string1\n");
}

printf("Enter 'string2'\n");
if ( scanf("%19s", string2) != 1 )
{
   // Problem reading into string2.
   printf("Unable to read string2\n");
}

printf("Input strings...\nstring1: \"%s\", string2: \"%s\"\n", string1, string2);

答案 1 :(得分:1)

您应该这样写,因为问题出在scanf

printf("Enter 'string1'\n");
scanf("%s",string1);
printf("Enter 'string2'\n");
scanf("%s",string2);

尝试读取字符串/指针时,请勿使用&

例如:

char *str;
scanf("%s", str);

您可以使用fread(string1, 20, stdin)来掩盖字符串溢出

您可以尝试输入代码here

答案 2 :(得分:0)

您的代码中的问题是,当从用户那里接收字符串时,您正在使用scanf(“%s”,&string1)存储该字符串,您需要了解&string1和string1都提供相同的地址,但是它们都非常多当增加&string1时,它指向基地址的80个字节,因为在增加指针时,它指向其类型的相同位置,&string1表示整个数组的基地址,而string1表示第一个元素的地址,所以当您增加它,它指向比基地址更远的4个字节。因此,当您为scanf提供一个地址来存储字符串时,请注意所提供的地址类型,否则可能会给您带来一些不确定的行为。在您的程序中代替&string1在scanf中使用string1来接收字符串,其余程序是正确的。