字数统计调试

时间:2014-05-25 19:50:23

标签: c

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

  

您如何测试字数统计程序?什么样的输入   如果有错误,最有可能发现错误吗?

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

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

#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);
}

2 个答案:

答案 0 :(得分:2)

问题背后的想法是说明“白盒子”测试的概念。查看程序中的每个“选择点”,看看如何运用它背后的逻辑来揭示“极端情况”:

  • 要行使while循环,请输入没有数据的输入(即EOF即将出现)
  • 为程序提供一行文件,但在\n之前没有EOF来执行行计数if
  • 为程序提供一个文件,其中包含一行或多行完全由空格字符组成的
  • 为程序提供一个缺少最后\n的文件,并查看最后一个单词是否被计算
  • 为程序提供包含单字符字词的文件,以实现在INOUT之间切换的逻辑

答案 1 :(得分:2)

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

  1. 一个空文件。
  2. 只包含新行且没有单词的文件。
  3. 一个字长很长的文件,全部在一行上。
  4. 一行文字非常长,多行。
  5. 程序可能会产生无效输出,但如果给定特殊字符,则不应该崩溃。
  6. 使用&#34; N&#34;测试程序在整个文档的随机位置插入空白行。
  7. 使用&#34; N&#34;测试程序在文档开头插入空白行。
  8. 使用&#34; N&#34;测试程序在文档末尾插入空白行。
  9. 使用一个字符单词和长单词测试程序,包括带有这些输入的带连字符的单词:

    1. 每个单词只有一个空格的文件。
    2. 带有一个空格的文件或&#34; N&#34;分隔每个单词的空格。
    3. 只有一个标签分隔每个单词的文件。
    4. 带有一个空格的文件或&#34; N&#34;分隔每个单词的标签。
    5. 每个单词只有一个空格或标签的文件。
    6. 带有一个空格的文件或&#34; N&#34;空格或标签分隔每个单词。
    7. 使用单引号和双引号测试程序,在单词和引号之间加上和不加空格,并使用嵌套的引号级别。
    8. 此外:

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