【发布时间】:2020-06-06 15:02:42
【问题描述】:
有这个:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char *up(char *);
int main() {
char initstr[20];
printf("enter string\n");
fgets(initstr, 20, stdin);
char *str = up(initstr);
printf("%s\n", str);
}
char *up(char *in) {
char *ret;
for (ret = in;
*in != '\n';
*(ret++) = toupper(*(in++))
);
return ret;
}
运行如下:
$./a.out
enter string
abc
#only new line from `printf("%s\n",str);`
从调试器
Hardware watchpoint 3: in
Old value = 0x7fffffffdc20 "abc\n"
New value = 0x7fffffffdc21 "bc\n"
Hardware watchpoint 2: ret
Old value = 0x7fffffffdc20 "abc\n"
New value = 0x7fffffffdc21 "bc\n"
Hardware watchpoint 3: in
Old value = 0x7fffffffdc21 "bc\n"
New value = 0x7fffffffdc22 "c\n"
Hardware watchpoint 2: ret
Old value = 0x7fffffffdc21 "bc\n"
New value = 0x7fffffffdc22 "c\n"
...
我可以看到两个变量都在减少,但我想逐个字符地更改ret 内联。但在最后(循环之后),ret 减少为空,程序只会输出\n。那么如何在循环头中实现这一点呢?
编辑: 感谢下面的回答,考虑到我必须返回指针的第一个地址,我可以通过这个实现 loop_head-only 函数:
char *up(char *in){
char *ret;
size_t size=strlen(in);
for(ret=in;
*in!='\n';
*(ret++)=toupper(*(in++))
);
return (ret-size+1);
}
【问题讨论】:
-
您的
up函数应该就地更改字符串,在这种情况下不需要返回任何内容,或者它应该返回字符串的修改副本,而原始字符串保持不变。你的返回一个指向原始字符串末尾的指针,这是没有意义的。为什么ret和in在整个循环中都具有相同的值?