[英]how to change single char in string array?
有這個:
#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
inline , char 。 但在最后(循環后), ret
減少到零,程序只會 output \n
。 那么我怎樣才能在循環頭中實現這一點呢?
編輯:感謝下面的回答,考慮到我必須返回指針的第一個地址,我可以通過以下方式實現 loop_head-only function:
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
一直遞增到換行符( \n
)並返回ret
指向字符串中的該字符。 您應該改為返回指向初始字符的指針。
for
子句中,難以閱讀且容易出錯。toupper()
不會更改換行符。char
值傳遞給toupper()
因為此 function 和<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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.