反向字符串

时间:2016-08-03 11:40:30

标签: c string

#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;
}

上述程序中的错误是什么。我只是从每个字符串的两端交换值。

3 个答案:

答案 0 :(得分:2)

除其他外,

char *s[]={"To err is human...","But to really mess things up...","One needs to know C!!"};

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

至少将此更改为char s[][100] = {"To err is human...","But to really mess things up...","One needs to know C!!"};

答案 1 :(得分:1)

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

char s[][255]={"To err is human...",
      "But to really mess things up...","One needs to know C!!"};

答案 2 :(得分:0)

作为相关的C FAQ points out

  

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

char a[] = "string literal";
char *p  = "string literal";
     

如果我尝试为p [i]指定新值,我的程序会崩溃。

     

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

     
      
  1. 作为char数组的初始值设定项,如char a[]的声明中所述,它指定该数组中字符的初始值(如果需要,还指定其大小)。

  2.   
  3. 在其他地方,它变成一个未命名的静态字符数组,这个未命名的数组可能存储在只读存储器中,因此不一定能被修改。在表达式上下文中,数组一如既往地转换为指针(参见第6节),因此第二个声明将p初始化为指向未命名数组的第一个元素。

  4.         

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

有很多方法可以解决这个问题。一种可能性是在reverse_string函数中使用strdup,并将其反转。这要求呼叫者承担free反向字符串的责任。

strdup不是一个很棒的函数,因为它需要找到正在复制的字符串的长度,这意味着你最终会遍历一个额外的时间。解决这个问题的一种方法是自己分配内存。

#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;
}