因此我的程序运行正常,除了一件事,函数计数的字母不正确。例如,如果输入“为什么在那里”!作为字符串,显示的字母数是3,而不是13。我不确定我做错了什么,我们将不胜感激。谢谢!
这是我的代码:
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
void Count_All(char*, int&, int&, double&, int&); // Function prototype.
double Calc_Average (char*, int, int, double); // Function prototype.
int main()
{
const int size = 500;
char userString[size];
int Word = 0;
int Pun = 0;
int Letters = 0;
double Total_Characters = 0;
double Average = 0.0;
cout << "Please enter a string of 500 or less characters: ";
cin.getline(userString, size);
int len = strlen(userString);
char *Dyn_Array = new char[len+1];
strcpy(Dyn_Array, userString);
cout << "\n";
Count_All (Dyn_Array, Letters, Word, Total_Characters, Pun);
cout << "Number of letters in the string: " << Letters << "\n";
cout << "\n";
cout << "Number of words in the string: " << Word << "\n";
cout << "\n";
Average = Calc_Average (Dyn_Array, Word, Pun, Total_Characters);
cout <<"Average number of letters per word: "<< fixed <<
showpoint << setprecision(2) << Average << "\n" << endl;
cin.ignore(1);
delete [] Dyn_Array;
return 0;
}
void Count_All (char*strptr, int &Letters, int &Word, double &Total_Characters, int &Pun) // Counts all characters and types.
{
while (*strptr != '\0')
{
if ((isspace(*strptr)) || (ispunct(*strptr)))
{
while ((isspace(*strptr)) || (ispunct(*strptr)))
{
strptr++;
}
}
for(int x = 0; x < strlen(*strptr); x++)
{
if(!isspace(strptr[x]) && !Ispunct(strptr[x]))
{
Letters++;
}
}
//if (((*strptr >= 'a') && (*strptr <= 'z')) || ((*strptr >= 'A') && (*strptr <= 'Z')))
//Letters++;
if ((isalnum(*strptr)) || (ispunct(*strptr)))
{
Word++;
while ((isalnum(*strptr))||(ispunct(*strptr)))
{
strptr++;
Total_Characters++; // Counting the total printable characters (including digits and punctuation).
if((ispunct(*strptr)))
{
Pun++; // Counting punctuation.
}
}
}
strptr++;
}
}
double Calc_Average(char*strptr, int Word, int Pun, double Total_Characters) // Calculates the average number of characters per words.
{
double Average = 0.0;
Total_Characters = Total_Characters - Pun; // Subtracting punctuation from all of the characters in the string (not including spaces).
Average = (Total_Characters / Word);
return Average;
}
最佳答案
for(int x = 0; x < strlen(*strptr); x++)
鉴于
strptr
是char *
,编译器很可能会大声地对您大吼大叫,因为您是将char
传递给strlen()
而不是char *
。即使编译器仍生成可执行文件,也不能忽略来自编译器的大声尖叫。即使按以下方式解决此问题,仍然会产生完全错误的结果:
for(int x = 0; x < strlen(strptr); x++)
{
if(!isspace(strptr[x]) && !Ispunct(strptr[x]))
{
Letters++;
}
}
这是第二个内部循环。外循环遍历每个字符
strptr
,执行一堆东西,包括这个内循环。因此,如果所讨论的字符串是“ hello”:
在外循环的第一次迭代中,
strptr
指向'h',并且该内循环将Letters
加5。在外循环的第二次迭代中,
strptr
指向'e',并且此内循环将Letters
加4。在外循环的第三次迭代中,
strptr
指向第一个“ l”,并且该内循环将3加到Letters
上。在外循环的第四次迭代中,
strptr
指向第二个“ l”,并且该内循环将Letters
加2。在外循环的第五次迭代中,
strptr
指向'o',并且此内循环将Letters
加1。该代码最终计数字符串“ hello”中的5 + 4 + 3 + 2 + 1或15个字母。显然不是正确的结果。
完全不需要此内部循环。摆脱它。
您还应该在计算机上找到一个非常有用的工具,称为“调试器”。使用该工具,您将能够一步一步地执行代码,检查所有变量,并自行确定此问题。学习如何使用调试器是每个C ++开发人员的必备技能。
编辑:字母计数可能应该合并在您的单词检测器中,因为它也会提高
strptr
的质量。它不仅弄乱了单独的字母计数逻辑,而且还因其自身的优点而被破坏,因为它可以将strptr
推进到终止的\0
字符,而最终的strptr++
将再次推进它,从而导致未定义的行为,并可能导致崩溃。总体逻辑有太多问题。应该从头开始重写它。关于c++ - 我的C++代码中的Letter计数器无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38623917/