【问题标题】:String reverse program throws exception字符串反向程序抛出异常
【发布时间】:2010-09-12 23:30:06
【问题描述】:
// ExampleCodes.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<stdio.h>
#include<iostream>
using namespace std;    

char* stringReverse(char* s)    
{    

    char temp, *p,*q;    
    q = s;    
    while( *(++q));    
    for( p = s; p &lt; --q; p++)    
    {    
        temp = *p;    
        *p = *q;     
        *q = temp;    
    }    
    return s;    
}    


int _tmain(int argc, _TCHAR* argv[])    
{    

    stringReverse("StringReverse");    
    return 0;    
}    

【问题讨论】:

标签: c++


【解决方案1】:

你不能修改常量字符串。

stringReverse("StringReverse");

您可以改用字符数组:

char str[] = "StringReverse";

【讨论】:

    【解决方案2】:

    字符串字面量,如"StringReverse",不允许在C中修改。使用数组:

    char str[] = "StringReverse";
    stringReverse(str);
    

    请注意,如果您向 stringReverse() 函数提供长度为零的字符串,则它的行为未定义。

    【讨论】:

      【解决方案3】:

      您从未为 p 分配任何内存。你可以试试p = new char[sizeof(s)];

      【讨论】:

      • p 不需要自己的内存 - 该函数就地反转字符串。
      • 好吧,我错了。他的功能对我来说似乎没有多大意义。我认为可以对其进行更改以使其更加清晰。
      【解决方案4】:

      也许你应该这样写:

      // in - string to reverse
      // out - buffer for reversed string
      // l - size of in
      
      StringReverse(char* in, char* out, int l) {
        for (int i=0;i<l;i++) {
          out[l-(i+1)] = in[i];
        }
      }
      

      *[] 和 *(p++) / *(p--) 之间几乎没有速度差异

      【讨论】:

        【解决方案5】:

        好吧,我本来打算清理 OP 中糟糕的源代码,但我会发布一个更简洁的版本:

        #include <stdio.h>
        #include <string.h>
        
        void reverse_string(char *s)
        {
            char *q = s + strlen(s);
            for (char *p = s; p < --q; p++)
            {
                char temp = *p;
                *p = *q;
                *q = temp;
            }
        }
        
        int main()
        {
            char s[] = "StringReverse";
            reverse_string(s);
            puts(s);
            return 0;
        }
        

        看在你的份上,我希望你还是个学生。

        更新0

        这实际上是纯 C,所以要学习并敬畏它的性能,但不要像这样开始编写 C++。

        【讨论】:

        • 我很想对“清理”代码投反对票,然后添加 xor hack。
        • 我很想对 xor hack 投反对票。除非你有一个基准表明 xor 普遍比使用临时更快,否则不要打扰它。
        • xor 的东西只是为了好玩,我会删除它。
        • 不过,这是一个 C++ 问题。 std::swap(*p,*q) 是怎么回事?而在 C++ 中,这些标头应该是 &lt;cstdio&gt;&lt;cstring&gt;,它是 std::strlen()
        • @sbi:是的,没错。突然间我不想做 C++(那很快,我还没有开始);]
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-26
        • 1970-01-01
        • 1970-01-01
        • 2018-07-19
        • 2016-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多