问题描述
我正试图反转一个字符串,但它保持不变。除了<string.h>
和<stdio.h>
之外,我不使用任何其他模块。
void rev(s){
char i,temp;
char *sf = s;
char ri = strlen((s) - 1);
char *sl = &s[ri];
for (i = 0; i < ri; i++){
if (*sf != *sl){
temp = *sf++;
s[i] = *sl--; //
s[ri--] = temp; //those two seems to be getting new characters,but it won't
}
else {
ri--;
sf++;
sl--;
}
}
printf("%s",s);
}
解决方法
该函数至少不会编译,因为该参数没有类型说明符。
void rev(s){
类型char
的可接受值范围很小。因此,请勿将其用于计算字符串的长度。
此声明中strlen
的调用
char ri = strlen((s) - 1);
调用未定义的行为。看来你是说
char ri = strlen(s) - 1;
还可以为空字符串调用未定义的行为。
此循环
for (i = 0; i < ri; i++){
不使用指针。
可以按照以下演示程序中所示的方式定义该功能。
#include <stdio.h>
#include <string.h>
char * reverse( char *s )
{
if ( *s )
{
for ( char *first = s,*last = s + strlen( s ); first < --last; ++first )
{
char c = *first;
*first = *last;
*last = c;
}
}
return s;
}
int main( void )
{
char s1[] = "1";
char s2[] = "12";
char s3[] = "123";
puts( reverse( s1 ) );
puts( reverse( s2 ) );
puts( reverse( s3 ) );
}
程序输出为
1
21
321
,
您的代码有很多问题(错误?):
char ri = strlen((s) - 1);
必须为size_t ri = strlen((s)) - 1;
其他代码很难分析,因为您使用的不是自解释变量名。
这里您的代码更加简单,而且分析起来也容易得多。
char *reverseString(char *str)
{
char *wrk = str,*end;
if(str && *str)
{
end = str + strlen(str) - 1;
while(end > wrk)
{
char temp = *wrk;
*wrk++ = *end;
*end-- = temp;
}
}
return str;
}
int main(void)
{
char str[] = "1234567890";
printf("reversed: %s\n",reverseString(str));
}
,
一个简单的解决方案:
char *sl = sf;
while (*sl != 0)
++ sl;
-- sl;
while (sf < sl)
{
char c = *sf;
*sf = *sl;
*sl = c;
++sf,--sl;
}
通过跳过所有字符直到找到NUL(零)字符来查找字符串的末尾。
然后退回一个字符(减量sl
),以便您拥有指向字符串的第一个和最后一个字符的指针。
然后将两个指针彼此指向并交换字符,直到指针相交或交叉。