【发布时间】:2019-02-23 18:56:16
【问题描述】:
我是 C 的初学者,所以我想看看一个代码,它包括计算给定文件中的字符数、单词数和行数。我发现了下面的代码,但问题是我不明白为什么我们必须在 while 循环之后为最后一个单词增加单词和行:if (characters > 0)...
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
char path[100];
char ch;
int characters, words, lines;
/* Input path of files to merge to third file */
printf("Enter source file path: ");
scanf("%s", path);
/* Open source files in 'r' mode */
file = fopen(path, "r");
/* Check if file opened successfully */
if (file == NULL) {
printf("\nUnable to open file.\n");
printf("Please check if file exists and you have read privilege.\n");
exit(EXIT_FAILURE);
}
/*
* Logic to count characters, words and lines.
*/
characters = words = lines = 0;
while ((ch = fgetc(file)) != EOF) {
characters++;
/* Check new line */
if (ch == '\n' || ch == '\0')
lines++;
/* Check words */
if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\0')
words++;
}
/* Increment words and lines for last word */
if (characters > 0) {
words++;
lines++;
}
/* Print file statistics */
printf("\n");
printf("Total characters = %d\n", characters);
printf("Total words = %d\n", words);
printf("Total lines = %d\n", lines);
/* Close files to release resources */
fclose(file);
return 0;
}
【问题讨论】:
-
char ch;-->>int ch;(并且:你不是在计算单词,你是在计算空白字符) -
拥有 int ch 的目标是与 EOF 兼容
-
假设输入文件不以换行符结尾。尝试使用包含“foo”的 3 字节长文件(而不是像往常一样的“foo\n”)。 [我说那个文件(3 字节“foo”)有 3 个字符、1 个单词和 0 行;但您的程序可能有其他意见。]
-
scanf("%s", path);– 切勿在未指定width的情况下使用转换说明符%s来限制写入目标的字符数。对于char path[100];使用scanf("%99s", path);... 99 + 终止'\0'= 100。同时定义/声明变量尽可能接近它们的使用位置。它是int main(void)。