因此我的程序运行正常,除了一件事,函数计数的字母不正确。例如,如果输入“为什么在那里”!作为字符串,显示的字母数是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++)


鉴于strptrchar *,编译器很可能会大声地对您大吼大叫,因为您是将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/

10-12 16:16