我编写了此程序,以查找并打印出最长的单词([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);
}
答案 0 :(得分:1)
问题是:
temp_string
和longest_string should be defined with a size of
input_length + 1` longest_string
将*longest_string = '\0';
设置为空字符串,以免在行上没有字母的情况下打印未初始化的数组。(sen[i] >= 'a' && sen[i] <= 'z') || (sen[i] >= 'A' && sen[i] <= 'Z')
中的isalpha((unsigned char)sen[i])
或更好的<ctype.h>
。memset
的电话太过分了。您应该只用temp_string
在temp_string[current_len] = '\0';
中设置空终止符,以便strcpy
可以将其复制为C字符串并摆脱两个memset
调用。您实际上不需要复制子字符串,只需跟踪当前单词和最长单词的偏移量即可:
#include <ctype.h>
#include <stdio.h>
void LongestWord(const char *sen) {
int i, len, best_start, best_len;
best_start = best_len = 0;
for (i = 0; sen[i] != '\0'; i++) {
if (isalpha((unsigned char)sen[i]) {
// we have a letter: compute the word length
for (len = 1; isalpha((unsigned char)sen[i + len]; len++)
continue;
if (len > best_len) {
// remember the longest word's offset and length
best_start = i;
best_len = len;
}
// skip all letters (-1 because of i++ in the for loop)
i += len - 1;
}
}
// use `%.*s` to print a substring with printf
printf("Longest string: %.*s\n", best_len, sen + best_start);
}