簡體   English   中英

程序在C ++中崩潰

[英]Program crashing in C++

我剛剛開始學習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;
}

程序完成打印結果后程序崩潰。 我錯過了一些非常明顯的東西嗎?

副問題:變量'other'總是增加,即使它不應該。 我使用else語句錯了嗎?

您還沒有為string分配內存

試試這個(在堆棧上分配):

char string[256];

或(在堆上分配):

char* string = new char[256];

delete[] string;

UPDATE

使用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;
}

如果前面的if語句為false,則執行else語句。 在您的情況下,當(character > 47 && character <58)為假時,其他值會增加。 你可能想要使用else-if代替:

if(){
...
}else if{
...
}else if{
...
}else{
...
}

嘗試char string[256]而不是char* string; 我猜getline需要一個指向已分配內存的指針作為輸入。

您還沒有為string分配內存,使用該名稱可能不是一個好主意:

char* string ;

因為你using namespace std ,所以可以工作而不是影子std::string替代聲明:

char str[21] ;

在你的代碼中,如果你想使用std::string你必須這樣做:

std::string someStringVar ;

因為在聲明char *string后使用它將不起作用:

string someStringVar ;

這似乎打敗了using namespace std的目的。

您應該使用char而不是int來表示字符。 這是因為int通常是4個字節而char只有1個字節(因此足以表示一個字符)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM