问题描述
我正在编写一个程序,该程序将多个单词作为输入,并确定如果单词按字典顺序列出,哪个单词将首先出现和最后出现。但是我的程序还没有完全运行。
代码:
#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;
}
,
您将 str
与 smallest
或 largest
进行比较。但问题是 smallest
和 largest
被初始化为空字符串(被声明为全局)。这意味着 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);
}