循环以反转C中的字符串

时间:2015-11-21 00:52:44

标签: c arrays function char reverse

所以我在SO上环顾四周,无法找到能够回答我问题的代码。我编写了一个函数,它应该将字符串反转为cmd-line中的输入。这是功能:

void reverse (char string[]) {
    int x;
    int i = 0;
    char line[strlen(string)];

    for (x = strlen(string) - 1; x > 0; x--) {
        char tmp = string[x];
        line[i] = tmp;
        i++;
    }
    string = line;
}

当我调用reverse()函数时,字符串保持不变。即,' abc'遗体' abc'

如果需要更多信息或问题不合适,请与我们联系。

谢谢!

4 个答案:

答案 0 :(得分:2)

您宣布line数组char更短一个,记住最后的null

另一点,它应该是for (x = strlen(string) - 1; x >= 0; x--),因为您需要复制0处的字符。

void reverse (char string[]) {
    int x;
    int i = 0;
    char line[strlen(string) + 1];

    for (x = strlen(string) - 1; x >= 0; x--) {
        char tmp = string[x];
        line[i] = tmp;
        i++;
    }

    for(x = 0; x < strlen(string); x++)
    {
        string[x] = line[x];
    }
}

请注意,当传递空字符串或字符串文字时,此函数将导致启示(如Bobby Sacamano所说)。

建议您可以这样做:void reverse(char source[], char[] dest)并检查源字符串是否为空。

答案 1 :(得分:1)

代码中的最后一行什么都不做 string = line;

参数按值传递,因此如果更改其值,则仅对函数本地。指针是它们指向的内存地址的值。如果要修改函数传递的指针,则需要指向该指针。

以下是您如何做到这一点的简短示例。

void reverse (char **string) {
    char line = malloc(strlen(*string) + 1);
    //automatic arrays are deallocated once the function ends
    //so line needs to be dynamically or statically allocated

   // do something to line

    *string = line;
}

这个问题的一个明显问题是你可以用静态内存初始化字符串,然后这个方法将用动态内存替换静态内存,然后你必须释放动态内存。这没有任何功能上的错误,它只是有点危险,因为意外释放字符串文字是非法的。

char *test = "hello";
reverse(test);
free(test); //this is pretty scary

此外,如果测试被分配为动态内存,则指向它的指针将丢失,然后它将成为内存泄漏。

答案 2 :(得分:1)

我认为你的答案几乎是正确的。你实际上并不需要为行中的空字符添加额外的插槽。您只需要进行两项小改动:

  • 将过程底部的赋值语句更改为memcpy。
  • 将循环条件更改为&lt; -

所以,你的正确代码是:

void reverse (char string[]) {
  int x;
  int i = 0;
  char line[strlen(string)];

  for (x = strlen(string) - 1; x >= 0; x--) {
    char tmp = string[x];
    line[i] = tmp;
    i++;
  }
  memcpy(string, line, sizeof(char) * strlen(line));
}

答案 3 :(得分:1)

由于您想要反转字符串,首先必须决定是要反转字符串的副本,还是原位反转字符串(就地)。由于您在'C'上下文中询问了这一点,因此假设您要更改现有字符串(反转现有字符串)并在调用函数中复制字符串(如果要保留原始字符串)。

您将需要字符串库

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

数组索引有效,此版本采用该方法,

/* this first version uses array indexing */
char*
streverse_a(char string[])
{
    int len; /*how big is your string*/
    int ndx; /*because 'i' is hard to search for*/
    char tmp; /*hold character to swap*/
    if(!string) return(string); /*avoid NULL*/
    if( (len=strlen(string)) < 2 ) return(string); /*one and done*/
    for( ndx=0; ndx<len/2; ndx++ ) {
        tmp=string[ndx];
        string[ndx]=string[len-1-ndx];
        string[len-1-ndx]=tmp;
    }
    return(string);
}

但你可以用指针做同样的事情,

/* this is how K&R would write the function with pointers */
char*
streverse(char* sp)
{
    int len, ndx; /*how big is your string */
    char tmp, *bp, *ep; /*pointers to begin/end, swap temporary*/
    if(!sp) return(sp); /*avoid NULL*/
    if( (len=strlen(bp=sp)) < 2 ) return(sp); /*one and done*/
    for( ep=bp+len-1; bp<ep; bp++, ep-- ) {
        tmp=*bp; *bp=*ep; *ep=tmp; /*swap*/
    }
    return(sp);
}

(不,真的,编译器对返回void的收费不会太少。)

因为 总是 测试您的代码,

char s[][100] = {
    "", "A", "AB", "ABC", "ABCD", "ABCDE",
    "hello, world", "goodbye, cruel world", "pwnz0r3d", "enough"
};

int
main()
{
    /* suppose your string is declared as 'a' */
    char a[100];
    strcpy(a,"reverse string");

    /*make a copy of 'a', declared the same as a[]*/
    char b[100];
    strcpy(b,a);
    streverse_a(b);
    printf("a:%s, r:%s\n",a,b);

    /*duplicate 'a'*/
    char *rp = strdup(a);
    streverse(rp);
    printf("a:%s, r:%s\n",a,rp);
    free(rp);

    int ndx;
    for( ndx=0; ndx<10; ++ndx ) {
        /*make a copy of 's', declared the same as s[]*/
        char b[100];
        strcpy(b,s[ndx]);
        streverse_a(b);
        printf("s:%s, r:%s\n",s[ndx],b);

        /*duplicate 's'*/
        char *rp = strdup(s[ndx]);
        streverse(rp);
        printf("s:%s, r:%s\n",s[ndx],rp);
        free(rp);
    }
}