在不使用反向的情况下在C ++中反转字符串

时间:2014-07-22 03:29:12

标签: c++ string

我编写了以下代码来反转字符串而不使用<algorithm> reverse。我写道:

#include <string.h>
#include <iostream>
using namespace std;


void reverse(char *str){
    int sizeStr=strlen(str);
    int firstChar,lastChar,temp;
    for(lastChar = (sizeStr - 1),firstChar = 0 ; lastChar>firstChar ; lastChar--, firstChar++){
        temp = str[firstChar];
        str[firstChar]=str[lastChar];
        str[lastChar] = temp;
    }
}
int main() {
    char *str;
    str = "myname";
    reverse(str);
    cout << str << endl; 
    return 0;
}

我在str[firstChar]=str[lastChar];遇到了段错误。请帮我弄清楚我的错误。

注意:我宣布char str[] = "myname"并且工作得很好。但根据您的所有解释,我们必须了解*strstr[]的差异。非常感谢。在帮助新程序员方面做了很长的工作。

7 个答案:

答案 0 :(得分:5)

您无法修改常量字符串文字。

对于C ++

使用std::string(感谢@chris)。使用std::swap来交换字符。 (见C++ string swap character places

对于C

malloc一个缓冲区(字符串的长度),strcpy字符串,然后为新分配的缓冲区执行reverse

答案 1 :(得分:1)

使用std :: string,您可以使用以下方法来反转字符串

string reverse_string(string arg){
    int length = arg.length();
    char res[length];
    for(int i = length - 1; i >= 0; i--){
        res[length - (i+1)] = arg[i];
    }
    string result(res);
    return result;
}

如果您有任何其他问题,请与我们联系。

答案 2 :(得分:0)

str的内容是常量,你应该使用char指针。

答案 3 :(得分:0)

原因是你没有将内存分配给字符指针str。

#include <string.h>
#include <iostream>
using namespace std;


void reverse(char *str){
    int sizeStr=strlen(str);
    int firstChar,lastChar,temp;
    for(lastChar = (sizeStr - 1),firstChar = 0 ; lastChar>firstChar ; lastChar--, firstChar++){
        temp = str[firstChar];
        str[firstChar]=str[lastChar];
        str[lastChar] = temp;
    }
}
int main() {
    char *str;
    // Here use malloc to allocate memory to the character pointer str
    // Or instead of using a char pointer use a character array to initialize the string
    // char *str = malloc(strlen("myname") + 1)   or usr char str[10] = "myname"
    str = "myname";
    reverse(str);
    cout << str << endl; 
    return 0;
}

答案 4 :(得分:0)

#include <string.h>
#include <iostream>
using namespace std;


void reverse(char *str){
        int sizeStr=strlen(str);
        int firstChar,lastChar,temp;
        for(lastChar = (sizeStr - 1),firstChar = 0 ; lastChar>firstChar ; lastChar--, firstChar++){
        temp = str[firstChar];
        str[firstChar]=str[lastChar];
        str[lastChar] = temp;
   }
}

int _tmain(int argc, _TCHAR* argv[])
{
    char *str;
    str = "myname";
    char *str2 = new char [strlen(str)+1];
    strcpy(str2,str);
    reverse(str2);
    cout << str2 << endl; 
    delete [] str2;
    str2 = NULL;
    cout << str << endl; 
    return 0;
}

答案 5 :(得分:0)

我认为你可能会以艰难的方式解决这个问题。如果使用std :: string,问题会变得容易多了。下面是一个更通用的C ++ 1y解决方案,它将能够反转许多不同类型的容器。容器必须覆盖[]运算符。

#include <iostream>

template <typename T>
auto rev(T &&a){
  for (auto i = 0; i < a.size()/2; ++i){
    std::swap(a[i], a[a.size()-1-i]);
  }
  return a;
}

int main(){
  std::string x = "hello";
  std::cout<< rev(x);
}

答案 6 :(得分:0)

#include <string.h>
#include <iostream>

void myreverse(std::string &s) {
    size_t begin = 0, end = s.length();

    while ((begin != end) && (begin != --end))
        std::swap(s[begin++], s[end]);
}

int main() {
    const char *str = "myname";
    std::cout << str << std::endl; 

    std::string newstr(str);
    myreverse(newstr);
    std::cout << newstr << std::endl; 
    return 0;
}