有这种情况:
#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内嵌的char改为char。但是在结束时(后循环),ret被减少到零,并且程序只输出\n。那么,如何在循环头中实现这一点呢?
编辑:感谢下面的回答,考虑到我必须返回指针的第一个地址,我可以通过以下方式实现循环_head函数:
char *up(char *in){
char *ret;
size_t size=strlen(in);
for(ret=in;
*in!='\n';
*(ret++)=toupper(*(in++))
);
return (ret-size+1);
}发布于 2020-06-06 15:21:09
up中的错误是一直递增ret到换行符(\n),并返回指向字符串中这个字符的ret。相反,应该返回指向初始字符的指针。
使用索引编写此函数要简单得多。使用空体将所有逻辑打包到for子句中的
char值传递给toupper(),因为此函数和来自<ctype.h>的所有函数仅定义为unsigned char和特殊负值EOF的值。在默认情况下对char进行签名的平台上,字符串可能包含负char值,在传递给toupper()时可能会导致未定义的行为。将它们转换为(unsigned char)以避免此问题.以下是修改后的版本:
#include <ctype.h>
#include <stdio.h>
char *up(char *s) {
for (size_t i = 0; s[i] != '\0'; i++) {
s[i] = toupper((unsigned char)s[i]);
}
return s;
}
int main() {
char initstr[20];
printf("enter string\n");
if (fgets(initstr, sizeof initstr, stdin)) {
char *str = up(initstr);
printf("%s\n", str);
}
return 0;
}https://stackoverflow.com/questions/62233572
复制相似问题