C中的反向函数生成单词,然后生成垃圾

C中的反向函数生成单词,然后生成垃圾,c,string,char,reverse,C,String,Char,Reverse,我正在实现一个在C中反转字符串的函数。这是我的代码: void reverse(char *str) { int strlength = strlen(str); int len = strlength+1; char rev[len]; int i = 0; while(strlength > 0) { rev[i++] = str[--strlength]; } strcpy(str, re

我正在实现一个在C中反转字符串的函数。这是我的代码:

void reverse(char *str) {
    int strlength = strlen(str);
    int len = strlength+1;
    char rev[len];      
    int i = 0;      
    while(strlength > 0) {
        rev[i++] = str[--strlength];
    }
    strcpy(str, rev);
}
以下是主要功能:

main(int argc, char *argv[]) {
    int i;
    for(i=1;i<argc;i++) {
        printf("[%s <==> ", argv[i]); 
        reverse(argv[i]);
        printf("%s].. ",argv[i]);
        printf("\n");
    }

您不能在rev[]中以零结尾字符串,将


在while循环之后

您不能在rev[]中对字符串进行零终止,将

在while循环之后

在此循环之后

while(strlength > 0)
{
    rev[i++] = str[--strlength];
}
插入附加语句

rev[i] = '\0'; 
你的功能太复杂了。我会这样写

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

    for ( i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n - i - 1];
        s[n - i - 1] = c;
    }

    return s;
}
在这种情况下,main函数也可以编写得更简单。比如说

int main(int argc, char *argv[])
{
   int i;

   for ( i = 1; i < argc; i++ )
   {
      printf( "[%s <==> ", argv[i] ); 
      printf( "%s].. \n", reverse( argv[i] ) );
   }
}
考虑到尽管通常反向函数都有返回类型,但void字符串函数在返回类型上有自己的约定。通常,它们返回一个指向字符串的指针。

在此循环之后

while(strlength > 0)
{
    rev[i++] = str[--strlength];
}
插入附加语句

rev[i] = '\0'; 
你的功能太复杂了。我会这样写

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

    for ( i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n - i - 1];
        s[n - i - 1] = c;
    }

    return s;
}
在这种情况下,main函数也可以编写得更简单。比如说

int main(int argc, char *argv[])
{
   int i;

   for ( i = 1; i < argc; i++ )
   {
      printf( "[%s <==> ", argv[i] ); 
      printf( "%s].. \n", reverse( argv[i] ) );
   }
}
考虑到尽管通常反向函数都有返回类型,但void字符串函数在返回类型上有自己的约定。通常,它们返回一个指向字符串的指针。

您希望这样:

void reverse(char *str)
{
  int j = strlen(str) - 1 ;
  int len = (j + 1) / 2 ;

  int i ;
  for (i = 0; i < len; i++)
  {
     char c = str[i] ;
     str[i] = str[j] ;
     str[j] = c ;
     j-- ;
  }
}
你想要这个:

void reverse(char *str)
{
  int j = strlen(str) - 1 ;
  int len = (j + 1) / 2 ;

  int i ;
  for (i = 0; i < len; i++)
  {
     char c = str[i] ;
     str[i] = str[j] ;
     str[j] = c ;
     j-- ;
  }
}

反向在strcpy之前不归零终止转速。尝试将rev[i]='\0'放入;在你的while循环之后,倒过来。也可以是memcpystr,rev,len;,可能更快。反向不会在strcpy之前终止零转速。尝试将rev[i]='\0'放入;在你的while循环之后,倒过来。也可以是memcpystr,rev,len;,可能更快。关于空终止,只有第二部分是正确的。或者'rev[strlength]='\0';`在while循环之前,null终止rev字符串。关于null终止,只有第二部分是正确的。或者'rev[strlength]='\0';`在while循环之前,null终止rev字符串。@sp2danny最好是这样的原函数不调用其他函数。也就是说,他们不需要额外的资金headers@sp2danny不过,我同意您的看法,即使用swap可以更容易地阅读。@sp2dany这样的原语函数不调用其他函数会更好。也就是说,他们不需要额外的资金headers@sp2danny不过,我同意你的看法,使用swap可以更容易阅读。建议使用whilestrlength>0而不是whilestrlength/2+1>0。whilestrlength/2+1>0会为str[]生成负索引。好吧,我的解决方案完全错误,但现在没问题。建议whilestrlength>0而不是whilestrlength/2+1>0。当strlength/2+1>0为str[]生成负索引时。好吧,我的解决方案完全错了,但现在没事了。