我想逐个打印字符,数字和特殊字符,但是在接受字符串时出错。
#include<iostream.h>
#include<string.h>
main()
{
string s = "124#$&afhj";
int i;
for(i=0;i<s.length();i++)
{
if((s[i]>=65&&91>=s[i])||(s[i]>=95&&123>=s[i]))
{
cout<<s[i]<<endl;
}
else
{
if(s[i]>=0&&s[i]<=9)
{
cout<<s[i]<<endl;
}
else
{
cout<<s[i];
}
}
}
}
答案 0 :(得分:2)
<iostream.h>
。它必须是<iostream>
。你不是在使用20世纪90年代的古代编译器,不是吗?有适用于Windows和Linux的优秀的免费和现代C ++编译器。下载一个并使用它。<string.h>
存在,但不是获取std::string
的正确标头;它反而包含C风格的char*
函数,而不是你想要的。main
必须返回int
,即使不需要return 0
声明。string
前缀,则无法使用cout
,endl
或std::
。因此,请std::string
,std::cout
和std::endl
。 Do not use using namespace std
。std::endl
but '\n'
. 'A'
。当然,您的>=
比较不能保证有效。在C ++中,实现这一点非常困难。您可以使用std::isalpha
但必须注意不要调用未定义的行为。另请参阅more detailed treatise on this subject。>=
比较。i
?它不必要地增加了它的范围。它的类型错误;当它应该是无符号的,或者只是std::string::size_type
时,它是一个有符号的int。但是,您应该考虑使用基于范围的for循环来遍历字符串。'0'
和'9'
。请注意,在这种情况下,即使不保证ASCII,C ++也能保证字符的连续值。因此,您可以安全地使用范围比较。我们走了:
#include <iostream>
#include <string>
#include <cctype>
int main()
{
std::string s = "124#$&afhj";
for (auto&& character : s)
{
if (std::isalpha(static_cast<unsigned char>(character)))
{
std::cout << character << '\n';
}
else
{
if (character >= '0' && character <= '9')
{
std::cout << character << '\n';
}
else
{
std::cout << character;
}
}
}
}
这会奏效。我不认为它真的有用,因为它的作用是:
但毕竟,这就是原计划的目的。
答案 1 :(得分:-1)
在你的代码中有很多错误。在我看来,您的代码应如下所示:
#include<iostream>
#include<string>
using namespace std;
int main() {
string s = "124#$&afhj";
unsigned int i;
for (i = 0; i < s.length(); i++) {
if ((s[i] >= 65 && 91 >= s[i]) || (s[i] >= 95 && 123 >= s[i])) {
cout << s[i] << endl;
} else {
if (s[i] >= 0 && s[i] <= 9) {
cout << s[i] << endl;
} else {
cout << s[i];
}
}
}
}