计算 C 中的字符、单词、行和段落
Counting characters, words, lines an paragraphs in C
我正在尝试从标准输入中计算 C 中的字符、单词、行和段落。
有些地方不工作,我不知道为什么。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int pCount=0, parCount=0, cCount=0, lCount=0;
double prom=0;
char c;
int newln_cnt=0;
while ((c=getchar())!=EOF){
cCount++;
switch (c)
{
case '\n':
newln_cnt++;
lCount++;
if (newln_cnt == 2)
{
parCount++;
newln_cnt = 0;
}
break;
case ' ':
pCount++;
break;
}
}
prom = (cCount / pCount);
printf("Total caracteres: %d \n", cCount);
printf("Cantidad palabras: %d \n", pCount);
printf("Cantidad líneas: %d \n", lCount);
printf("Cantidad párrafos: %d \n", parCount);
printf("Promedio longitud palabra: %f \n", prom);
return 0;
}
它有点适合角色(少显示一个)。但其余的都不好。
输入:
Oid, mortales, el grito sagrado:
"Libertad, libertad, libertad!"
Oid el ruido de rotas cadenas,
ved en trono a la noble igualdad.
Ya su trono dignisimo abrieron
las Provincias Unidas del Sud
y los libres del mundo responden:
"Al gran pueblo argentino, salud!
Al gran pueblo argentino, salud!"
Y los libres del mundo responden:
"Al gran pueblo argentino, salud!"
Sean eternos los laureles
que supimos conseguir,
que supimos conseguir.
Coronados de gloria vivamos...
o juremos con gloria morir!,
o juremos con gloria morir!,
o juremos con gloria morir!
预期输出:
Total caracteres: 558
Cantidad palabras: 87
Cantidad líneas: 25
Cantidad párrafos: 8
Promedio longitud palabra: 4.966
我的输出:
Total caracteres: 557
Cantidad palabras: 69
Cantidad líneas: 24
Cantidad párrafos: 12
Promedio longitud palabra: 8.000
程序计算字符数、单词数、行数和段落数(两个连续的'\n')。和平均字长 .
由于类型转换错误,它没有编译,但你可以对所有内容使用浮点数,它会编译:
#include <stdio.h>
int main(int argc, char const *argv[])
{
double pCount=0, parCount=0, cCount=0, lCount=0;
double prom=0;
char c;
int newln_cnt=0;
while ((c=getchar())!=EOF){
switch (c)
{
case '\n':
newln_cnt++;
lCount++;
if (newln_cnt == 2)
{
parCount++;
newln_cnt = 0;
}
break;
case ' ':
pCount++;
break;
}
}
prom = (cCount / pCount);
printf("Total caracteres: %f \n", cCount);
printf("Cantidad palabras: %f \n", pCount);
printf("Cantidad líneas: %f \n", lCount);
printf("Cantidad párrafos: %f \n", parCount);
printf("Promedio longitud palabra: %f \n", prom);
return 0;
}
现在程序已编译,您可以调整到最适合您编程的任何类型,您甚至可能拥有自己的类型。
一个与您的程序类似的著名程序是 wc - 字数统计,它是标准 Unix 库的一部分。
我在你的代码中发现了几个问题:
段落数:如果读取的字符与 \n
不同,则不要将 newln_cnt
设置为 0。每读两个 \n
就算一个段落。
空格数:您只考虑 ' '
个字符,您可能会错过其他白色 space 字符,例如 \t ou non breakable space。考虑使用 isspace()
函数。
平均行长:将两个整数相除得到一个浮点数,考虑转换:
prom = (float)cCount / (flao)pCount;
我的建议:从一段简短的文字(每行 3 个词,5 行)和一个调试器开始。
你的每一个计数条件都是错误的。
修复如下:
#include <stdio.h>
#include <ctype.h>
int main(void){
int pCount=0, parCount=0, cCount=0, lCount=0;//word, paragraph, character, line
int abCount = 0;//alphabet
double prom=0;
int c;//It should be int.
char pprev = '\n', prev = '\n';
while ((c=getchar())!=EOF){
++cCount;
if(isalpha(c))
++abCount;
if(isspace(c)){
if(c == '\n'){
++lCount;
}
} else if(isspace(prev)){//isspace(prev) && !isspace(c) : edge of top of word
++pCount;
if(pprev == '\n' && prev == '\n'){//edge of top of paragraph
++parCount;
}
}
pprev = prev;
prev = c;
}
if(prev != '\n'){//If the file is not terminated by newline
++lCount;
}
prom = (double)abCount / pCount;//(cCount - spcCount - punctCount) / pCount
printf("Total caracteres: %d \n", cCount);
printf("Cantidad palabras: %d \n", pCount);
printf("Cantidad lineas: %d \n", lCount);
printf("Cantidad parrafos: %d \n", parCount);
printf("Promedio longitud palabra: %.3f \n", prom);
return 0;
}
我正在尝试从标准输入中计算 C 中的字符、单词、行和段落。
有些地方不工作,我不知道为什么。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int pCount=0, parCount=0, cCount=0, lCount=0;
double prom=0;
char c;
int newln_cnt=0;
while ((c=getchar())!=EOF){
cCount++;
switch (c)
{
case '\n':
newln_cnt++;
lCount++;
if (newln_cnt == 2)
{
parCount++;
newln_cnt = 0;
}
break;
case ' ':
pCount++;
break;
}
}
prom = (cCount / pCount);
printf("Total caracteres: %d \n", cCount);
printf("Cantidad palabras: %d \n", pCount);
printf("Cantidad líneas: %d \n", lCount);
printf("Cantidad párrafos: %d \n", parCount);
printf("Promedio longitud palabra: %f \n", prom);
return 0;
}
它有点适合角色(少显示一个)。但其余的都不好。
输入:
Oid, mortales, el grito sagrado: "Libertad, libertad, libertad!" Oid el ruido de rotas cadenas, ved en trono a la noble igualdad. Ya su trono dignisimo abrieron las Provincias Unidas del Sud y los libres del mundo responden: "Al gran pueblo argentino, salud! Al gran pueblo argentino, salud!" Y los libres del mundo responden: "Al gran pueblo argentino, salud!" Sean eternos los laureles que supimos conseguir, que supimos conseguir. Coronados de gloria vivamos... o juremos con gloria morir!, o juremos con gloria morir!, o juremos con gloria morir!
预期输出:
Total caracteres: 558
Cantidad palabras: 87
Cantidad líneas: 25
Cantidad párrafos: 8
Promedio longitud palabra: 4.966
我的输出:
Total caracteres: 557
Cantidad palabras: 69
Cantidad líneas: 24
Cantidad párrafos: 12
Promedio longitud palabra: 8.000
程序计算字符数、单词数、行数和段落数(两个连续的'\n')。和平均字长 .
由于类型转换错误,它没有编译,但你可以对所有内容使用浮点数,它会编译:
#include <stdio.h>
int main(int argc, char const *argv[])
{
double pCount=0, parCount=0, cCount=0, lCount=0;
double prom=0;
char c;
int newln_cnt=0;
while ((c=getchar())!=EOF){
switch (c)
{
case '\n':
newln_cnt++;
lCount++;
if (newln_cnt == 2)
{
parCount++;
newln_cnt = 0;
}
break;
case ' ':
pCount++;
break;
}
}
prom = (cCount / pCount);
printf("Total caracteres: %f \n", cCount);
printf("Cantidad palabras: %f \n", pCount);
printf("Cantidad líneas: %f \n", lCount);
printf("Cantidad párrafos: %f \n", parCount);
printf("Promedio longitud palabra: %f \n", prom);
return 0;
}
现在程序已编译,您可以调整到最适合您编程的任何类型,您甚至可能拥有自己的类型。
一个与您的程序类似的著名程序是 wc - 字数统计,它是标准 Unix 库的一部分。
我在你的代码中发现了几个问题:
段落数:如果读取的字符与
\n
不同,则不要将newln_cnt
设置为 0。每读两个\n
就算一个段落。空格数:您只考虑
' '
个字符,您可能会错过其他白色 space 字符,例如 \t ou non breakable space。考虑使用isspace()
函数。平均行长:将两个整数相除得到一个浮点数,考虑转换:
prom = (float)cCount / (flao)pCount;
我的建议:从一段简短的文字(每行 3 个词,5 行)和一个调试器开始。
你的每一个计数条件都是错误的。
修复如下:
#include <stdio.h>
#include <ctype.h>
int main(void){
int pCount=0, parCount=0, cCount=0, lCount=0;//word, paragraph, character, line
int abCount = 0;//alphabet
double prom=0;
int c;//It should be int.
char pprev = '\n', prev = '\n';
while ((c=getchar())!=EOF){
++cCount;
if(isalpha(c))
++abCount;
if(isspace(c)){
if(c == '\n'){
++lCount;
}
} else if(isspace(prev)){//isspace(prev) && !isspace(c) : edge of top of word
++pCount;
if(pprev == '\n' && prev == '\n'){//edge of top of paragraph
++parCount;
}
}
pprev = prev;
prev = c;
}
if(prev != '\n'){//If the file is not terminated by newline
++lCount;
}
prom = (double)abCount / pCount;//(cCount - spcCount - punctCount) / pCount
printf("Total caracteres: %d \n", cCount);
printf("Cantidad palabras: %d \n", pCount);
printf("Cantidad lineas: %d \n", lCount);
printf("Cantidad parrafos: %d \n", parCount);
printf("Promedio longitud palabra: %.3f \n", prom);
return 0;
}