我刚开始学习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语句错了吗?
答案 0 :(得分: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;
}
答案 1 :(得分:3)
如果前面的else
语句为false,则执行if
语句。在您的情况下,当(character > 47 && character <58)
为false时,其他值会增加。您可能希望改为使用else-if
:
if(){
...
}else if{
...
}else if{
...
}else{
...
}
答案 2 :(得分:1)
尝试使用char string[256]
代替char* string;
。我猜getline
需要一个指向已分配内存的指针作为输入。
答案 3 :(得分:1)
您尚未为string
分配内存,使用该名称可能不是一个好主意:
char* string ;
由于你有std::string
,和替代声明会起作用而不是影子using namespace std
:
char str[21] ;
在您的代码中,如果您想使用std::string
,则必须执行此操作:
std::string someStringVar ;
因为在声明char *string
:
string someStringVar ;
这似乎打败了using namespace std
的目的。
答案 4 :(得分:0)
您应该使用char
代替int
来代表角色。这是因为int
通常是4个字节而char
只有1个字节(因此足以代表一个字符)。