【发布时间】:2013-04-11 11:05:52
【问题描述】:
我写了一个通过指针反转字符串的函数,代码运行良好,没有错误,但有些事情我想知道。
这是我的代码:
char * xstrrev(char *s1, char *s2){
register char *p = s1;
register char *q = s2;
char *r = s2;
do{
*(s2++) = *(p++); //first copy the string, afterwards, replace it
}while(*p);
p--; //to eliminate trailing '\0' while reversing.
do {
*(q++) = *(p--); //replace contents by reverse contents,
}while(*q);
return r;
}
这里,在倒数第三行, *q 必须有一个值 '\0' ,因为我们之前复制了确切的字符串,所以,'\0' 必须已经复制了。
然而,当我更换我的
*(s2++) = *(p++);
与
p++;
即我只把p加到字符串的末尾,不把字符串复制到s2,条件
而(*q)
仍然有效。在这种情况下,*q 不应该有\0,对吧?那么这个条件是如何起作用的呢?
当我用while(*q!='\0')替换while(*q)时也是一样的
编辑::它被称为:
char a[110]= "hello";
char f[116];
xstrrev(a,f); //reverse a and put to f
puts(f);
【问题讨论】:
-
这是如此未定义的行为!将
char f[116];更改为char f[116] = "helloworld";看看它是如何中断的。 -
为什么将
a设置为回文?你怎么知道它是否真的被颠倒了? :) -
@Barmar 任何其他字符串都一样,等等,我会编辑它。
-
我的评论与问题无关,只是偶然。