|
蓝森林 http://www.lslnet.com 2006年6月6日 10:18
<<C和指針>>一道題
编写函数reverse_string
Void reverse_string(char *string);
把参数字符串的字符反向排列,请用指针不用数组下标,不要使用C库中用于操纵字符串的函数。提示:不需要声明一个局部数组来临时存储参数字符串。
大家看看 |
void reverse_string(char *str )
{
char *p, *q;
if( string == NULL )
return ;
p = string ;
q = string +strlen( string ) - 1;
for( int i = 0; i < strlen( string ) / 2 + 1;i++ )
{
char t;
t = *p;
*p = *q;
*q = t;
p++;q--;
}
}
不知道这个符合你的要求吗? |
不能用庫函數,包括strlen |
闲来无事,练练手。写了一个,望各位指正
[code]
void reverse_string(char *string)
{
int len = 0;
int i = 0;
char temp;
if ( string == NULL)
return;
while (*(string+len) )
len++;
for (i = 0; i < len/2; i++)
{
temp = *(string+ i);
*(string + i) = *(string + len - 1 - i);
*(string + len - 1 - i) = temp;
}
return ;
}
[/code]
|
請大家看清題目。
不能用庫函數,包括strlen !!!!
void reverse_str(char *str)
{
char *p=str;
while(*p!='\0')
{
p++;
}
while(str<p)
{
char q;
q=*str;
*str++=*p;
*p--=q;
}
} |
Void reverse_string(char *string)
{
char *start = string;
char *end = string;
char temp;
while(*end++) ;
end--;
for( ;start<end;start++,end--){
temp = *start;
*start = *end;
*end = temp;
}
} |
疑似精华里面有一个同样的 |
黑苦咖啡
正解!!謝謝!!!! |
黑苦咖啡
太棒了 |
学习学习…… |
学习中,为何不写main函数啊, |
-->
写的不错,改正一个错误,加上简化一下
[code]void reverse(char *s)
{
char *e = s;
while (*e) e++;
for (e--; s<e; s++,e--) {
*s ^= *e;
*e ^= *s;
*s ^= *e;
}
}[/code] |
-->
好好的一个思路哦!!!学习一下!!!呵呵,不过,确实有一个小问题, 就是在[color=Red]end--;之后[/color] 还应该[color=Red]再end--;[/color]一次。
因为end在循环到字串结束的时候已经指到'\0'的下一个地址上了,这样的话回退指针end--指的位置也是'\0'的位置,直接赋值给temp,temp再给end的时候,*end就是'\0'.字串第一个字符是'\0'还怎么能够输出后面的东西呢?
所以我觉得回退的时候应该回退两次。
另外楼上的看到问题可能和我想的是一样的,但在在代码里却也少写了一次end--,不过我即使加上了end--,你的结果也不全,只有其中的一部分,但由于我没有用过^=,所以不敢妄加评论。:em34:
|
-->
while (*end++);
与
while (*end) end++;
可不一样哦 |
哦???指点一下呗?另外,^=这样的写法是异或么???为什么你的结果会不对呢? |
回复 14楼 seeLnd 的帖子
while (*end++);
与
while (*end) end++;
可不一样哦
能解释一下为什么吗?真的想不通! |
回去想了一下,想通了,就是先取值的问题。 |
还有为什么会有段错误,
...
*start = *end;
...
不明白?! |
| |