C中的反向函数生成单词,然后生成垃圾
我正在实现一个在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
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[]生成负索引时。好吧,我的解决方案完全错了,但现在没事了。