c - 字数调试

标签 c

K&R上,建议使用以下代码来计算输入中的单词、行和字符。练习 1.11 要求:

How would you test the word count program? What kinds of input are most likely to uncover bugs if there are any?

我看到的这些问题的唯一答案是在包含多行、单词和制表符的某些输入上测试代码。

你能看到任何其他方法来测试这段代码吗?

#include <stdio.h>

#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */

/* count lines, words and characters in input */

main(){
    int c, n1, nw, nc, state;

    state = OUT;
    n1 = nw = nc = 0;

    while ((c = getchar()) != EOF){
        ++nc;
        if (c == '\n')
            ++n1;
        if (c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else if (state == OUT){
            state = IN;
            ++ nw;
        }
    }
    printf("%d %d %d\n",n1,nw,nc);
}

最佳答案

使用以下所有类型的输入测试程序:

<醇>
  • 一个空文件。
  • 一个只有新行没有单词的文件。
  • 一个包含很长单词的文件,全部在一行上。
  • 包含很多行的非常长的单词的文件。
  • 该程序可能会产生无效输出,但如果给定特殊字符,则不应崩溃。
  • 在整个文档的随机位置插入“N”个空行来测试程序。
  • 在文档开头插入“N”个空行来测试程序。
  • 在文档末尾插入“N”个空行来测试程序。
  • 用单字符词和长词测试程序,包括带有这些输入的带连字符的词:

    1. 一个文件,每个单词之间只有一个空格。
    2. 用一个空格或“N”个空格分隔每个单词的文件。
    3. 只有一个制表符分隔每个单词的文件。
    4. 用一个空格或“N”个制表符分隔每个单词的文件。
    5. 只有一个空格或制表符分隔每个单词的文件。
    6. 用一个空格或“N”个空格或制表符分隔每个单词的文件。
    7. 使用单引号和双引号、单词和引号之间有无空格以及嵌套的引号级别测试程序。

    还有:

    1. 确保程序不会将不需要的字符计为单词或单词的一部分。例如,确保回车符是一个合法的 MS-DOS 字符,如果它包含在一行的末尾,则不会被计为一个单词。
    2. 为该应用程序指定空间创建尽可能大的文件,并确保该程序不会崩溃,其他应用程序不会受到影响,并且输出是正确的。
    3. 创建尽可能大的文件,为该应用程序指定空间,仅包含空格、换行符和制表符,文件末尾的单词除外,并确保程序不会崩溃,其他应用程序不会崩溃受影响,并且输出是正确的。
    4. 创建尽可能大的文件,为该应用程序指定空间,仅包含空格、换行符和制表符,文件开头的单词除外,并确保程序不会崩溃,其他应用程序不会受影响,并且输出是正确的。
    5. 创建为该应用程序指定空间的最大可能文件,仅包含一个很长的单词:程序的输出应为 1。
    6. 让程序编写一个调试文件,其中包含每个 while、if 和 else 语句的 printf。确保测试导致到达所有 printf 语句。换句话说,在测试结束时,不应有任何代码部分未使用。
    7. 输出与 wc 程序的输出不匹配应该有充分的理由。

    关于c - 字数调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23859366/

    相关文章:

    c - 如何将剩余的 for 循环更改为递归函数?

    c - 一个直接、简单的 api 作为系统运行?

    c - gcc:为什么两个不同的变量在调用后具有相同的值?

    c - 符号表局部静态变量名

    c - 为什么在bpf_helpers中定义了load_half,但在filter.c中却没有出现?

    c - 减少非线性模拟值到数字输出

    c++ - 预处理器#if 语句的工具/解析器?

    c - C 中的谓词是什么意思?

    c - 如何返回数组中读取的数字数量或 N(以较小者为准)?

    c - 在 C 中获取段错误