在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”个空格或制表符分隔每个单词的文件。
- 使用单引号和双引号、单词和引号之间有无空格以及嵌套的引号级别测试程序。
还有:
- 确保程序不会将不需要的字符计为单词或单词的一部分。例如,确保回车符是一个合法的 MS-DOS 字符,如果它包含在一行的末尾,则不会被计为一个单词。
- 为该应用程序指定空间创建尽可能大的文件,并确保该程序不会崩溃,其他应用程序不会受到影响,并且输出是正确的。
- 创建尽可能大的文件,为该应用程序指定空间,仅包含空格、换行符和制表符,文件末尾的单词除外,并确保程序不会崩溃,其他应用程序不会崩溃受影响,并且输出是正确的。
- 创建尽可能大的文件,为该应用程序指定空间,仅包含空格、换行符和制表符,文件开头的单词除外,并确保程序不会崩溃,其他应用程序不会受影响,并且输出是正确的。
- 创建为该应用程序指定空间的最大可能文件,仅包含一个很长的单词:程序的输出应为 1。
- 让程序编写一个调试文件,其中包含每个 while、if 和 else 语句的
printf
。确保测试导致到达所有 printf 语句。换句话说,在测试结束时,不应有任何代码部分未使用。 - 输出与
wc
程序的输出不匹配应该有充分的理由。
关于c - 字数调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23859366/