我尝试使用以下代码反转字符串,但得到一个永无止境的小方框输出。 (每行1个)
码
#include <iostream>
#include <math.h>
#include <iomanip>
#include <sstream>
int main() {
// Reversing A String
cout<<"welcome to string reverser"<<endl;
int sizeOfString;
cout<<"please input size of string"<<endl;
cin>>sizeOfString;
char charray3[sizeOfString];
cin>>charray3;
for(unsigned int i=sizeOfString-1; i>=0; i--){
cout<<charray3[i]<<endl;
}
return 0;
}
在我的尝试中,我将sizeOfString设置为3并将charray3设置为&#39; abc&#39;。
输出:
我做错了什么?
答案 0 :(得分:5)
\0
字符终止。std::string
。i>=0
始终为真,因为i
是无符号的(其中i
将是您的无符号在0
次迭代后可以保存的最大值) 答案 1 :(得分:5)
不要问字符串的大小。除了没有必要之外,它使您的程序非标准,因为可变长度数组构造char charray3[sizeOfString]
是编译器扩展。
使用std::getline
代替,它会根据需要分配读取多个字符。之后,以与上面相同的方式反向打印字符串,或者根据需要将字符串反转。小心无符号减法!但是,您的编译器应该警告您。
注意:如果您想知道为什么您的程序不起作用,在阅读'\n'
后,缓冲区中会有一个剩余的int
。由于该缓冲字符,只要您调用cin>>charray3
,程序就会返回一个空字符串。
答案 2 :(得分:2)
您正在重新发明轮子:)使用std::string
和std::reverse
:
#include <algorithm>
#include <iostream>
#include <string>
int main() {
std::string str{"Hello, World!"};
std::reverse(str.begin(), str.end());
std::cout << str << std::endl;
}
答案 3 :(得分:0)
您可以轻松使用类字符串:
#include <iostream>
#include <string>
int main()
{
std::string s1 = "Hello", s2;
for(int i(s1.length() - 1 ); i >= 0; i--)
s2+= s1[i];
std::cout << s1 << std::endl;
std::cout << s2 << std::endl;
return 0;
}
1-您输入sizeOfString
一个问题:
cin的输入如何溢出或下溢输入大小(更小或更大)???
例如:
sizeOfString = 5;
cin >> charray3; // "ab" now the size is only 3 (+ null terminator)
所以写道:
charray3[sizeOfString - 1] = 'c'; // charray3[5 - 1] // charray[4]
虽然未输入charray4,因为您仅输入了charray3[0]
和charray3[1]
,因此产生了段错误。
要纠正它你必须做一些额外的工作:
#include <iostream>
using namespace std;
int main()
{
// Reversing A String
cout << "welcome to string reverser" << endl;
int sizeOfString;
cout << "please input size of string" << endl;
cin >> sizeOfString; // you specified size
cin.ignore(1, '\n'); // clean the input buffer
char* charray3 = new char[sizeOfString + 1];
//cin>>charray3; use getline instead to get whitespaces
cout << "enter text: " << endl;
cin.getline(charray3, sizeOfString); // what if the user enter a text smaller or bigger than sizeOfString???
charray3[sizeOfString] = '\0';
//to correct it:
// take effects of input on sizeOfString
sizeOfString = strlen(charray3);
cout << "before reversing: " << endl;
cout << charray3 << endl;
// to reverse it create a temporary array:
char* pTmp = new char[sizeOfString + 1];
for(int i(sizeOfString-1), j = 0; i >= 0; i--, j++)
pTmp[j] = charray3[i];
pTmp[sizeOfString] = '\0';
cout << "after reversing: " << endl;
cout << pTmp << endl;
// don't forget to clean:
delete[] charray3;
delete[] pTmp;
return 0;
}
答案 4 :(得分:0)
// First method
const int MAXLENGTH = 100;
char s[MAXLENGTH];
cin >> s;
int len = strlen(s);
for(int i = 0; i < len/2; i++) {
char temp = s[i];
s[i] = s[len-1-i];
s[len-1-i] = temp;
}
cout << s;
// Second
string s;
cin >> s;
for(int i = 0, len = s.length(); i < len/2; i++) {
char t = s[i];
s[i] = s[len-1-i];
s[len-1-i] = t;
}
cout << s;
答案 5 :(得分:-2)
代码现在神秘地起作用。 1)我改变了循环使其成为一个前进循环并且它起作用 2)我恢复了问题代码并删除了无符号类型。
#include <iostream>
#include <math.h>
#include <iomanip>
#include <sstream>
int main() {
cout<<"welcome to string reverser"<<endl;
int sizeOfString;
cout<<"please input size of string"<<endl;
cin>>sizeOfString;
char charray3[sizeOfString];
cin>>charray3;
for(int i=sizeOfString-1; i>=0; i--){
cout<<charray3[i]<<endl;
}
return 0;
}
谢谢你的评论和回答。我将尝试各种替代代码。