使用 for 循环 C++ 反转字符串
reversing a string using a for loop C++
我尝试使用以下代码反转字符串,但得到的是永无止境的小框输出。 (每行 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 设置为 'abc'。
输出:
box output
我做错了什么?
- 标准 C++ 不允许您使用变量作为数组的大小。
- 字符串以
[=10=]
字符结束。
- 不要使用字符数组,而是
std::string
。
- 你的循环永远不会终止,因为
i>=0
总是正确的,因为 i
是无符号的(其中 i
将是你的无符号在 0
之后可以保持的最大价值迭代)。
不要询问字符串的大小。除了不必要之外,它还会使您的程序不标准,因为可变长度数组构造 char charray3[sizeOfString]
是编译器扩展。
改用std::getline
,它将根据需要分配读取的字符数。之后,按照与上面相同的方式反向打印字符串,或者如果您愿意,可以原地反转字符串。小心无符号减法!不过,您的编译器应该警告您。
注意:如果您想知道为什么您的程序无法运行,在读取 int
后缓冲区中还有剩余的 '\n'
.由于该缓冲字符,一旦您调用 cin>>charray3
.
,程序 returns 就会带有一个空字符串
您正在重新发明轮子:) 使用 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;
}
您可以轻松使用 class 字符串:
#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] = '[=13=]';
//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] = '[=13=]';
cout << "after reversing: " << endl;
cout << pTmp << endl;
// don't forget to clean:
delete[] charray3;
delete[] pTmp;
return 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;
代码现在神秘地工作了。
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;
}
谢谢大家的评论和回答。我将尝试提供的各种替代代码。
我尝试使用以下代码反转字符串,但得到的是永无止境的小框输出。 (每行 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 设置为 'abc'。
输出:
box output
我做错了什么?
- 标准 C++ 不允许您使用变量作为数组的大小。
- 字符串以
[=10=]
字符结束。 - 不要使用字符数组,而是
std::string
。 - 你的循环永远不会终止,因为
i>=0
总是正确的,因为i
是无符号的(其中i
将是你的无符号在0
之后可以保持的最大价值迭代)。
不要询问字符串的大小。除了不必要之外,它还会使您的程序不标准,因为可变长度数组构造 char charray3[sizeOfString]
是编译器扩展。
改用std::getline
,它将根据需要分配读取的字符数。之后,按照与上面相同的方式反向打印字符串,或者如果您愿意,可以原地反转字符串。小心无符号减法!不过,您的编译器应该警告您。
注意:如果您想知道为什么您的程序无法运行,在读取 int
后缓冲区中还有剩余的 '\n'
.由于该缓冲字符,一旦您调用 cin>>charray3
.
您正在重新发明轮子:) 使用 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;
}
您可以轻松使用 class 字符串:
#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] = '[=13=]';
//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] = '[=13=]';
cout << "after reversing: " << endl;
cout << pTmp << endl;
// don't forget to clean:
delete[] charray3;
delete[] pTmp;
return 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;
代码现在神秘地工作了。 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;
}
谢谢大家的评论和回答。我将尝试提供的各种替代代码。