首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何反转字符*类型的字符串?

如何反转字符*类型的字符串?
EN

Stack Overflow用户
提问于 2022-05-03 09:16:12
回答 2查看 356关注 0票数 0

我正在使用reverse函数。

代码语言:javascript
复制
void reverse(char s[]) {
    int i, j;
    char c;
 
    for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
        c = s[i]; 
        s[i] = s[j];
        s[j] = c;
    }
}

如果传递一个类型为char a[] = "abcd"的字符串,则得到输出dcba

但如果我通过了char *a = "abcd",我得到了bus error

我能否以某种方式反转char *类型的字符串?

源代码:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

void reverse(char s[]);

int main() {
    char a* = "abcd";
    reverse(a);
    printf("%s", a);
}

void reverse(char s[]) {
    int i, j;
    char c;
 
    for (i = 0, j = strlen(s) - 1; i < j; i++, j--) { 
        c = s[i]; 
        s[i] = s[j];
        s[j] = c; 
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-03 09:36:39

没有char *类型的字符串。字符串是以零字符'\0'结尾的一系列字符.

在这个声明中(有一个错误的char a* = "abcd";)

代码语言:javascript
复制
char *a = "abcd";

声明了一个指向字符串文本的指针。字符串文本本身具有char[5]类型。但作为初始化器表达式,它被隐式转换为指向其类型char *的第一个元素的指针。

您正在尝试更改函数reverse中的指针指向的字符串文本。

但是,您可能不会更改字符串文本。任何更改字符串文字的尝试都会导致未定义的行为。

来自C标准(6.4.5字符串文本)

如果

7的元素具有适当的值,则未指定这些数组是否是不同的。如果程序试图修改这样的数组,则行为是未定义的.。

您可以做的是创建一个新的字符串,它将以相反的顺序存储源字符串文本的字符。

例如

代码语言:javascript
复制
char * reverse_copy( const char *s )
{
    size_t n = strlen( s );

    char *t = malloc( n + 1 );

    if ( t != NULL )
    {
        t += n;
        *t = '\0';

        while ( *s ) *--t = *s++;
    }

    return t;
}

而这个函数可以调用如下

代码语言:javascript
复制
char *s = "abcd";
char *p = reverse_copy( s );
if ( p != NULL ) puts( p );
free( p );

这是一个演示程序。

代码语言:javascript
复制
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

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

    char *t = malloc( n + 1 );

    if (t != NULL)
    {
        t += n;
        *t = '\0';

        while (*s) *--t = *s++;
    }

    return t;
}

int main( void )
{
    char *s = "abcd";

    char *p = reverse_copy( s );
    if (p != NULL) puts( p );

    free( p );
}

程序输出是

代码语言:javascript
复制
dcba
票数 3
EN

Stack Overflow用户

发布于 2022-05-03 09:35:51

你的反向功能没问题。问题是通过这样做实例化字符串为文字:char *a = "abcd"; (它是'*a‘不是'a*’顺便说一句)

不能修改字符串文本。要测试您的函数,您可以这样做:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void reverse(char s[]);

int main(){
    char *a = malloc(sizeof(char) * 5);
    if (a == NULL)
        return 1;
    a[0] = 'a';
    a[1] = 'b';
    a[2] = 'c';
    a[3] = 'd';
    a[4] = '\0';
    reverse(a);
    printf("%s", a);
    free(a);
}

void reverse(char s[]){
     int i, j;
     char c;

     for (i = 0, j = strlen(s) - 1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72097221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档