反向字符串 #包括 #包括 int main() { char*s[]={“犯错是人的…”,“但要真正把事情搞砸…”,“需要知道C!!”; int i,j,len,t; 对于(i=0;i

反向字符串 #包括 #包括 int main() { char*s[]={“犯错是人的…”,“但要真正把事情搞砸…”,“需要知道C!!”; int i,j,len,t; 对于(i=0;i,c,string,C,String,嗯,其中一个错误是您没有包含string.h,因此这不是编译。另一个错误是您的char*数组可能会进入只读内存区域,修改它会导致奇怪的行为,因此您最好使用: #include <stdio.h> #include <stdlib.h> int main() { char *s[]={"To err is human...","But to really mess things up...","One needs to know C!!"}; int i,

嗯,其中一个错误是您没有包含
string.h
,因此这不是编译。另一个错误是您的
char*
数组可能会进入只读内存区域,修改它会导致奇怪的行为,因此您最好使用:

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

int main()
{
    char *s[]={"To err is human...","But to really mess things up...","One needs to know C!!"};
    int i,j,len,t;
    for(i=0;i<=2;i++)
    {
        len=strlen(s[i]);
        for(j=0;j<len/2;j++)
        {
            t=*(s[i]+len-1-j);
            *(s[i]+len-1-j)=*(s[i]+j);
            *(s[i]+j)=t;
        }
    }
    for(i=0;i<=2;i++)
        printf("%s\n",s[i]);
    return 0;
}
除其他外

char*s[]={“犯错是人的…”,“但要把事情搞砸…”,“需要知道C!!”};


这里声明并初始化一个指向char的指针数组。这样每个指针都指向一个给定的字符串文字。因此,无论您在
for
循环中执行什么操作来反转或更改这些字符串,都会导致未定义的行为(在这种情况下,UB通常是segfault/crash)

至少将此更改为
chars[][100]={“犯错是人的…”,“但要真正把事情搞砸…”,“你需要知道C!!”};

作为相关的C常见问题解答:

问:这些初始化之间有什么区别

char s[][255]={"To err is human...",
      "But to really mess things up...","One needs to know C!!"};
如果我试图给p[I]赋值,我的程序就会崩溃

答:字符串文字(C源代码中双引号字符串的正式术语)可以用两种稍有不同的方式使用:

  • 作为字符数组的初始值设定项,如在
    char a[]
    的声明中,它指定该数组中字符的初始值(如有必要,还指定其大小)

  • 在其他任何地方,它都会变成一个未命名的静态字符数组,该未命名数组可能存储在只读内存中,因此不必修改。在表达式上下文中,数组会像往常一样立即转换为指针(参见第6节),因此第二个声明初始化p以指向未命名数组的第一个元素

  • 有些编译器有一个开关控制字符串文字是否可写(用于编译旧代码),有些编译器可能有选项使字符串文字被正式视为
    const char
    的数组(以便更好地捕捉错误)

    有很多方法可以解决这个问题。一种可能是在
    reverse_string
    函数中使用,并将其反转。这需要调用方负责重新生成反转的字符串

    strdup
    不是一个很好的函数,因为它需要找到要复制的字符串的长度,这意味着您需要额外遍历一次。解决这个问题的一种方法是自己分配内存

    char a[] = "string literal";
    char *p  = "string literal";
    
    #包括
    #包括
    #包括
    煤焦*
    反向字符串(常量字符*s){
    字符*光标;
    字符*反转;
    尺寸与长度;
    如果(!s){
    返回NULL;
    }
    长度=strlen(s);
    反向=malloc(长度+1);
    如果(!反向){
    返回NULL;
    }
    如果(!长度){
    *反向='\0';
    反向返回;
    }
    光标=反向;
    while(长度--){
    *(光标++)=*(s+长度);
    }
    *游标='\0';
    反向返回;
    }
    内部主(空)
    {
    int i;
    char*s[]={
    “犯错是人的……”,
    “但要真的把事情搞砸……”,
    “一个人需要知道C!!”
    };
    对于(i=0;i
    您有问题吗?s是一个只读字符串数组。请尝试
    char s[][100]
    char*s[]={(char[]){“犯错是人类的…”,(char[]{“但要真正把事情搞砸…”,(char[]){“需要知道C!!”};
    为什么@WilliamPursell@NamanSharma请参阅C常见问题解答:您应该至少阅读一次整个常见问题解答。了解其中的内容非常有用。“因此,无论您在for循环中做什么,都可以反转或更改这些字符串”-->未定义的行为。Seg错误是一种常见的可能性,
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *
    reverse_string(const char *s) {
        char *cursor;
        char *reversed;
        size_t length;
    
        if (!s) {
            return NULL;
        }
    
        length = strlen(s);
    
        reversed = malloc( length + 1 );
    
        if (!reversed) {
            return NULL;
        }
    
        if ( !length ) {
            *reversed = '\0';
            return reversed;
        }
    
        cursor = reversed;
    
        while (length--) {
            *(cursor++) = *(s + length);
        }
    
        *cursor = '\0';
    
        return reversed;
    }
    
    
    int main(void)
    {
        int i;
        char *s[] = {
            "To err is human...",
            "But to really mess things up...",
            "One needs to know C!!"
        };
    
        for (i = 0; i < sizeof(s)/sizeof(s[0]); ++i) {
            char *reversed = reverse_string( s[i] );
            puts( reversed );
            free( reversed );
        }
    
        return 0;
    }