C打印最长字

时间:2019-05-02 13:57:04

标签: c

我编写了此程序,以查找并打印出最长的单词([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);
}

1 个答案:

答案 0 :(得分:1)

问题是:

  • temp_string和longest_string should be defined with a size of input_length + 1`
  • 您应该使用longest_string*longest_string = '\0';设置为空字符串,以免在行上没有字母的情况下打印未初始化的数组。
  • 避免在代码中对ASCII值进行硬编码,这是不可读的。您可以使用(sen[i] >= 'a' && sen[i] <= 'z') || (sen[i] >= 'A' && sen[i] <= 'Z')中的isalpha((unsigned char)sen[i])或更好的<ctype.h>
  • 仅在找到不是字母的字节时才测试最长的字符串。这样可以防止将最后一个单词包含在搜索中。相反,您应该首先找到一个字母,然后匹配所有后续字母并测试是否找到了更长的单词。
  • 打到memset的电话太过分了。您应该只用temp_stringtemp_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);
}