为什么 strcmp() 在我的程序中不起作用?

问题描述

我正在编写一个程序,该程序将多个单词作为输入,并确定如果单词按字典顺序列出,哪个单词将首先出现和最后出现。但是我的程序还没有完全运行。

代码

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

void getword(void);

char str[20];
char smallest[20];
char largest[20];

int main(int argc,char *argv[]) {
    while (strlen(str) != 4) {
        getword();

        if (strcmp(str,smallest) < 0) {
            strcpy(smallest,str);
        } else
        if (strcmp(str,largest) > 0) {
            strcpy(largest,str);
        }
    }

    printf("smallest:%s\nlargest:%s\n",smallest,largest);

    return 0;
}

void getword(void) {
     printf("Enter a word: ");
     scanf("%s",str);
}

用户必须输入单词,我假设单词长度不超过 20 个字符,如果用户输入 4 个字母的单词,则程序将停止。

我遇到的问题是第一个 if 语句(按字典顺序测试最小的单词)不起作用。当程序运行时,输出如下所示:

Enter a word: dog
Enter a word: zebra
Enter a word: rabbit
Enter a word: catfish
Enter a word: walrus
Enter a word: cat
Enter a word: fish
smallest:
largest:zebra

正如你所看到的,'smallest' 这个词没有被选中,if 语句中的一个简单的 printf 语句告诉我,我的程序甚至根本没有进入 if 语句,这是为什么?

解决方法

存在多个问题:

  • 您在从用户读取单词之前测试了 str 的长度,因此将处理 4 个字母的单词。
  • 如果输入的单词长度超过 19 个字符,您应该将 scanf("%s",str) 保护为 scanf("%19s",str) 以避免缓冲区溢出。
  • smallest 是一个全局变量,因此被初始化为一个空字符串,所以它总是小于任何非空输入。您应该避免使用全局变量。
  • 如果输入单个单词,它将既是最小单词又是最大单词,因此您不应使用 else 语句或对第一个单词进行特殊处理。

这是修改后的版本:

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

// read a word from the user,return the word length
int getword(char *str) {
    printf("Enter a word: ");
    *str = '\0';
    scanf("%19s",str);
    return strlen(str);
}

int main(int argc,char *argv[]) {
    char str[20];
    char smallest[20] = "";
    char largest[20] = "";

    while (getword(str) != 4) {
        if (*smallest == '\0' || strcmp(str,smallest) < 0) {
            strcpy(smallest,str);
        }
        if (strcmp(str,largest) > 0) {
            strcpy(largest,str);
        }
    }
    printf("smallest:%s\n",smallest);
    printf("largest:%s\n",largest);

    return 0;
}
,

您将 strsmallestlargest 进行比较。但问题是 smallestlargest 被初始化为空字符串(被声明为全局)。这意味着 str 可能包含 "Dog"/"Zebra"/"cat"/"anything"smallest 包含 ""(空字符串)。在这种情况下,(strcmp(str,smallest) < 0) 将始终为 false。因此,smallest 将始终保持不变,最终结果将是 smallest = ""。你的程序做对了,并且打印出最小的结果是空字符串。

你可以做的是:

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

void getword(void);

char str[20];      //str = ""
char smallest[20]; //smallest= ""
char largest[20];  //largest = ""


int main(int argc,char *argv[])
{
    //>--------extra part begins-->---------------
    scanf("%s",smallest);
    strcpy(largest,smallest);
    //<--------extra part ends--<---------------

    while (strlen(str) != 4)
    {
      getword();

      if (strcmp(str,smallest) < 0)
      {
          strcpy(smallest,str);
      }

      else if (strcmp(str,largest) > 0)
      {
          strcpy(largest,str);
      }
 }

    printf("smallest:%s\nlargest:%s\n",smallest,largest);

    return 0;
}

void getword(void){
     printf("Enter a word: ");
     scanf("%s",str);
}