gpt4 book ai didi

计算文件中字符数、单词数和行数的C代码

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:17 25 4
gpt4 key购买 nike

我是 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;
}

最佳答案

这个程序有一些问题:

  • ch 必须定义为 int 以允许正确检测 EOF

  • scanf("%s", path); 的输入过长将导致 path 溢出并导致未定义的行为。还要检查返回值以检测无效输入或文件过早结束:

    if (scanf("%99s", path) != 1)
    return 1;
  • 测试 ch == '\0' 来计算行数是有争议的。标准 wc unix 实用程序不会将空字节视为行分隔符。

  • if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\0') 也是不是检测单词边界的标准方法。 if (isspace(ch)) 更加地道。

  • 字数不正确:多个空格将被视为多个字!您应该改为检测边界,即空格字符后跟非空格字符。

  • 最后的测试是解决上述问题的蹩脚尝试,它还不够。如果流不以换行符结束,则确实需要额外的测试来计算流的最后一个。

这是一个更正的版本:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
FILE *file;
char path[1024];
int ch, last;
long long int characters, words, lines;

/* Input path of files to merge to third file */
printf("Enter source file path: ");
if (scanf("%255s", path) != 1) {
printf("Invalid input\n");
return EXIT_FAILURE;
}

/* Open source files in 'r' mode */
file = fopen(path, "r");

/* Check if file opened successfully */
if (file == NULL) {
printf("Unable to open file %s\n", path);
printf("Please check if file exists and you have read privilege.\n");
return EXIT_FAILURE;
}

/*
* Logic to count characters, words and lines.
*/
characters = words = lines = 0;
last = '\n';
while ((ch = fgetc(file)) != EOF) {
characters++;

/* Check new line */
if (ch == '\n')
lines++;

/* Check words */
if (!isspace(ch) && isspace(last))
words++;

last = ch;
}

/* Increment words and lines for last word */
if (last != '\n') {
lines++;
}

/* Print file statistics */
printf("\n");
printf("Total characters = %lld\n", characters);
printf("Total words = %lld\n", words);
printf("Total lines = %lld\n", lines);

/* Close file to release resources */
fclose(file);

return 0;
}

关于计算文件中字符数、单词数和行数的C代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54845010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com