簡體   English   中英

如何更改字符串數組中的單個字符?

[英]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指向字符串中的該字符。 您應該改為返回指向初始字符的指針。

  • 使用索引編寫此 function 更簡單。
  • 將所有邏輯打包到帶有空主體的for子句中,難以閱讀且容易出錯。
  • 另請注意,字符串可能不包含換行符,因此在 null 終止符處停止更安全, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM