字符串反转而不改变原始字符串

时间:2015-03-25 20:06:39

标签: c string

所以这里似乎有过多的字符串反转问题,但我想要做的具体内容似乎没有被涵盖。我这样做只是因为C中的复习没有重要意义。我想要达到的标准,

1.编写一个可以反转字符串的函数

2.不得改变原来的

3.只能将原始字符串作为参数

4.不应使用现有的字符串反转功能

我最初编写了简单的代码来进行反转,但是很难让它不改变原始代码。初始代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char *reverse(char *inString){
    int j = 0;
    j = strlen(inString) -1;
    char temp;
    for(int i = 0 ; i<=j; i++,j--){
        temp = inString[i];
        inString[i] = inString[j];
        inString[j] = temp;
    }
    return inString;
}


int main(){
    char string[20]="hello world";
    printf("%s\n",string);
    char *outString = reverse(string);
    printf("%s\n",string);
    printf("%s\n",outString);
}

输出:

hello world
dlrow olleh
dlrow olleh

4 个答案:

答案 0 :(得分:4)

我的建议:

  1. 为新字符串分配内存。
  2. 填写包含输入字符串反向的新字符串。
  3. 返回新字符串。
  4. 确保在调用函数中释放新字符串的内存。
  5. 类似的东西:

    char *reverse(char *inString)
    {
       int len = strlen(inString);
       char* retString = malloc(len+1);
       if ( retString != NULL )
       {
          for(int i = 0 ; i < len; ++i)
          {
             retString[len-1-i] = inString[i];
          }
          retString[len] = '\0';
       }
       return retString;
    }
    

答案 1 :(得分:2)

这是一个演示程序,显示了如何编写函数。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * reverse( const char *s )
{
    size_t n = strlen( s );

    char *t = malloc( ( n + 1 ) * sizeof( char ) );

    if ( t )
    {
        size_t i = 0;
        for ( ; i < n; i++ ) t[i] = s[n - i - 1];
        t[i] = '\0';
    }

    return t;
}

int main(void) 
{
    char *s = "Hello World";
    char *t = reverse( s );

    puts( s );
    puts( t );

    free( t );

    return 0;
}

程序输出

Hello World
dlroW olleH

如你所见,你必须为反向字符串分配内存。

答案 2 :(得分:0)

string和outString引用内存中的同一个对象,即&#34; hello world&#34;字符串数组,这就是为什么你得到相同的反向字符串。

您可以复制数组并反转副本,也可以将字符串反转为原始形式。

答案 3 :(得分:0)

你的问题是你确实正在修改你的输入字符串,在行:

inString[i] = inString[j];

你不需要做这样的事情。只需在内存中对其适当的空间进行malloc后,设置输出字符串的第j个字符。