【发布时间】:2014-12-22 18:51:41
【问题描述】:
我刚刚用 C 语言编写了一个相当简单的程序来查找 smallest word 和 largest word。我有 3 个变量如下:
char smallest[20]; // smallest word
char largest[20]; // largest word
char word[20]; // the word entered by user
然后我会提示用户输入他想要的任何单词:
while (1) {
printf("Enter a word: ");
while((ch = getchar()) != '\n') {
word[i++] = ch;
}
}
然后我将word与smallest和largest进行比较,以达到在用户输入的单词中找到最小和最大单词的结果。
if (strcmp(word, smallest) < 0) {
strcpy(smallest, word);
}
if (strcmp(word, largest) > 0) {
strcpy(largest, word);
}
最后,如果用户不输入任何单词就直接输入,程序将终止。
该程序正确找到largest 字,但我的问题是找到smallest 字。
如果你想复制/粘贴来测试它,这里是整个程序。
#include <stdio.h>
#include <string.h>
int main(void) {
char smallest[20] = "";
char largest[20] = "";
char word[20] = "";
while (1) {
int i = 0;
char ch;
strcpy(word, "");
printf("Enter a word: ");
while((ch = getchar()) != '\n') {
word[i++] = ch;
}
if (strcmp(word, smallest) < 0) {
strcpy(smallest, word);
}
if (strcmp(word, largest) > 0) {
strcpy(largest, word);
}
if (strlen(word) == 0) break;
}
printf("Smallest word: %s\n", smallest);
printf("Largest word: %s\n", largest);
return 0;
}
请告诉我如何修改它以正确找到smallest 和largest 字词。
【问题讨论】:
-
字符是否最大 = "";错字?你的意思是 char large[20] = "";?
-
这是我不知道如何以及何时正确初始化它们
-
您需要将输入的第一个单词直接复制到最小,因为空字符串比较“小于”任何其他字符串,因此您已将
smallest_word初始化为可能的最小单词。您可以改用更复杂的初始化,例如memset(smallest, '\xFF', sizeof(smallest)-1); smallest[sizeof(smallest)-1] = '\0';;这是适合 20 字节缓冲区的“最大”字(以空字符结尾的字符串)。如果代码遇到EOF,您也会遇到问题;你的循环继续,你必须中断这个程序来停止它。 -
@JonathanLeffler,我在正确初始化
smallest和largest时遇到问题。谢谢你的好点 -
1) 最佳初始化方法 char variable[20] = {'\0'};但是,在保存新单词之前需要重新初始化它(可能通过 memset()),因此缓冲区中没有剩余的垃圾。 2) 读取单词的循环没有大小限制,因此如果用户输入的单词超过 19 个字符,则会发生缓冲区溢出,这可能/将导致 seg fault 事件。
标签: c