【发布时间】:2019-05-06 08:42:36
【问题描述】:
我编写了这个程序来查找并打印出最长的单词([a-zA-Z] 字符的连续字符串),其中字符串是用户输入的。该代码有效,但确实有一个错误,如果我输入任何特殊字符,如“!”输出将打印出最长的单词以及其他一些奇怪的字符。如果我不输入任何特殊字符,程序将按预期工作。我确信这很简单,但我无法弄清楚是什么导致了这个错误。
任何改进代码的方法都将不胜感激。
感谢大家的宝贵时间。
#include <stdio.h>
#include <string.h>
#define MAX_INPUT 1000
void LongestWord(char sen[]);
int main(void) {
char input[MAX_INPUT];
LongestWord(fgets(input, MAX_INPUT, stdin));
return 0;
}
void LongestWord(char sen[]) {
int i, current_len, longest_len, input_length;
input_length = strlen(sen);
char temp_string[input_length];
char longest_string[input_length];
current_len = longest_len = 0;
for (i = 0; i < input_length; i++) {
//If it is a letter
if ((sen[i] >= 97 && sen[i] <= 122) || (sen[i] >= 65 && sen[i] <= 90)) {
temp_string[current_len] = sen[i];
current_len++;
} else {
if (current_len > longest_len) {
//Clear longest string
memset(longest_string, 0, sizeof(longest_string));
//Copy temp_string to longest string
strcpy(longest_string, temp_string);
//set longest length equal to current
longest_len = current_len;
//Clear temp_string
memset(temp_string, 0, sizeof(temp_string));
}
current_len = 0;
}
}
printf("Longest string: %s\n", longest_string);
}
【问题讨论】:
-
使用函数/宏
isalpha可能会使代码更易读tutorialspoint.com/c_standard_library/c_function_isalpha.htm -
当字符串中没有字母时,
longest_string未初始化。这就是“奇怪的字符”的来源。将memset移到循环之前。 -
一般不要使用“幻数”,如 92、122、65 和 90,而可以使用 'a'、'z'、'A'、'Z'。跨度>
-
您可以在这里做的最好的事情是使用您最喜欢的调试器单步执行程序。这样做比让 SO 上的某个人为您指出问题所学到的要多得多。
-
关于:
char temp_string[input_length];这不会为尾随的 NUL 字节留出空间。建议:char temp_string[ input_length +1 ];
标签: c