我写了一个简单的C ++程序来反转一个字符串。我在字符数组中存储一个字符串。要反转字符串,我使用相同的字符数组和临时变量来交换数组的字符。
#include<iostream>
#include<string>
using namespace std;
void reverseChar(char* str);
char str[50],rstr[50];
int i,n;
int main()
{
cout<<"Please Enter the String: ";
cin.getline(str,50);
reverseChar(str);
cout<<str;
return 0;
}
void reverseChar(char* str)
{
for(i=0;i<sizeof(str)/2;i++)
{
char temp=str[i];
str[i]=str[sizeof(str)-i-1];
str[sizeof(str)-i-1]=temp;
}
}
现在这个方法不起作用,我在程序执行后获得NULL String作为结果。
所以我想知道为什么我不能将字符数组等同,为什么这个程序不起作用。我可以使用什么解决方案或技巧来使相同的程序工作?
答案 0 :(得分:44)
sizeof(str)
没有达到您的预期。鉴于char *str
,sizeof(str)
不会为您提供该字符串的长度。相反,它将为您提供指针占用的字节数。您可能正在寻找strlen()
。
如果我们解决了这个问题,我们会:
for(i=0;i<strlen(str)/2;i++)
{
char temp=str[i];
str[i]=str[strlen(str)-i-1];
str[strlen(str)-i-1]=temp;
}
std::swap()
在C ++中,如果要交换两个变量的内容,请使用std::swap
而不是临时变量。
所以而不是:
char temp=str[i];
str[i]=str[strlen(str)-i-1];
str[strlen(str)-i-1]=temp;
你只需写:
swap(str[i], str[sizeof(str) - i - 1]);
注意那是多么清楚。
std::reverse()
std::reverse(str, str + strlen(str));
如果变量不是必需的话,将变量变为全局变量的做法非常糟糕。特别是,我指的是i
。
如果我要写这个函数,它看起来就像下面两个实现之一:
void reverseChar(char* str) {
const size_t len = strlen(str);
for(size_t i=0; i<len/2; i++)
swap(str[i], str[len-i-1]);
}
void reverseChar(char* str) {
std::reverse(str, str + strlen(str));
}
经过测试,这两项都会在dlrow olleh
的输入上生成hello world
。
答案 1 :(得分:0)
问题是在你的函数中,str
不是数组而是指针。因此sizeof
将获得指针的大小,而不是它指向的数组的长度。此外,即使它给你数组的大小,这不是字符串的长度。为此,请更好地使用strlen
。
为避免多次调用strlen
,请为函数提供另一个参数,该参数指示长度:
void reverseChar(char* str, int len)
{
for(i=0; i<len/2; i++)
{
char temp=str[i];
str[i]=str[len-i-1];
str[len-i-1]=temp;
}
}
并用
调用它 reverseChar(str, strlen(str))
评论中提到的另一项改进是在循环体中使用std::swap
:
void reverseChar(char* str, int len)
{
for(i=0; i<len/2; i++)
{
std::swap(str[i], str[len-i-1]);
}
}
此外,还有std::reverse
几乎就是这样。
答案 2 :(得分:-1)
//reverse a string
#include<iostream>
using namespace std;
int strlen(char * str) {
int len = 0;
while (*str != '\0') {
len++;
str++;
}
return len;
}
void reverse(char* str, int len) {
for(int i=0; i<len/2; i++) {
char temp=str[i];
str[i]=str[len-i-1];
str[len-i-1]=temp;
}
}
int main() {
char str[100];
cin.getline(str,100);
reverse(str, strlen(str));
cout<<str<<endl;
getchar();
return 0;
}
答案 3 :(得分:-2)
如果我是你,我会这样写:
int main()
{
string str;
cout << "Enter a string: " << endl;
getline(cin, str);
for (int x = str.length() - 1; x > -1; x--)
{
cout << str[x];
}
return 0;
}
这是一种非常简单的方法,并且效果很好。
答案 4 :(得分:-2)
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
char str[80];
cout << "Enter a string bro: \n";
gets_s(str);
for (int i = strlen(str) - 1; i > -1; i--)
{
cout << str[i];
}
}