3

我刚开始学习 C++,这是我为练习而编写的程序:

#include <iostream>
#include <string>
using namespace std;

int main ()
{
    int uppercase=0, lowercase=0, digits=0, other=0, i=0;
    int character;
    char* string;
    cout << "Enter a string!\n";
    cin.getline(string, 20); 

    while(true)
        {
        character = int(*(string+i));
        if (character==0)
            {
            break;
            }
        if (character > 64 && character < 91)
            {
            uppercase++;
            }
        if (character > 96 && character < 122)
            {
            lowercase++;
            }
        if (character > 47 && character <58)
            {
            digits++;
            }
        else
            {
            other++;
            }
        i++;
        }

    cout << "Upper case " << uppercase << "\n";
    cout << "Lower case " << lowercase << "\n";
    cout << "Digits " << digits << "\n";
    cout << "Others " << other << "\n";

    return 0;
}

程序在完成打印结果后崩溃。我在这里错过了一些非常明显的东西吗?

附带问题:变量“其他”总是增加,即使它不应该增加。我使用 else 语句是否错误?

4

5 回答 5

8

您还没有为string

试试这个(在堆栈上分配):

char string[256];

或(在堆上分配):

char* string = new char[256];

delete[] string;

更新

使用std和 预定义isdigit(),isalpha()等,代码可以改写如下:

#include <iostream>
#include <string>

int main ()
{
    int uppercase=0, lowercase=0, digits=0, other=0;

    std::cout << "Enter a string!\n";

    std::string myline;
    std::getline(std::cin, myline);

    for (std::string::iterator i = myline.begin(); i != myline.end(); ++i)
    {
        if (isdigit(*i))
        {
            digits++;
        }
        else if (isalpha(*i))
        {
            isupper(*i) ? uppercase++
                        : lowercase++;
        }
        else
        {
            other++;
        }
    }

    std::cout << "Upper case " << uppercase << "\n";
    std::cout << "Lower case " << lowercase << "\n";
    std::cout << "Digits " << digits << "\n";
    std::cout << "Others " << other << "\n";

    return 0;
}
于 2013-05-13T13:35:28.883 回答
3

else如果前面的语句为假,则执行该语句if(character > 47 && character <58)在您的情况下,当为假时,其他会增加。您可能想要使用else-if's 代替:

if(){
...
}else if{
...
}else if{
...
}else{
...
}
于 2013-05-13T13:36:24.413 回答
1

尝试char string[256]代替char* string;. 我想getline需要一个指向分配内存的指针作为输入。

于 2013-05-13T13:36:03.367 回答
1

您尚未为该名称分配内存string并且使用该名称可能不是一个好主意:

char* string ;

和替代声明,std::string因为你有using namespace std

char str[21] ;

如果你想使用std::string你的代码,你必须这样做:

std::string someStringVar ;

因为在您声明后使用它不起作用char *string

string someStringVar ;

这似乎违背了using namespace std.

于 2013-05-13T13:36:23.660 回答
0

您应该使用char而不是int来表示字符。这是因为int通常是 4 个字节并且char只有 1 个字节(所以刚好可以代表一个字符)。

于 2013-05-13T13:40:40.677 回答