簡體   English   中英

如何在C中替換字符串中的字符?

[英]How to replace a character in a string in C?

我正在寫一個函數,用字符串中的“#”替換給定字符。 該函數應返回一個指針,該指針指向剛替換的字符之后的位置。 另外,該字符串不是以NULL結尾的,它以'#'結尾。 字符串無法復制,應自行修改。 現在,我有以下內容:

char *es_token(char *s, char c)
{
int i = 0;
while(s[i] != '#'){
    if (s[i] == c){
       putchar('#');
       i++;
    }
    else{
        return 0;
    }
}

return (char*)(s);
}

我不知道在這種情況下如何返回指針。 我將衷心感謝您的幫助。

C字符串char *s指向字符i的指針是該條目的地址:

&s[i]

假設s[i]只是*(s + i)的簡寫,則上述內容與以下內容相同:

s + i

您的代碼的其他問題:

  • putchar向終端寫入一個字符。 它不會替換字符串中的任何內容。 為此,使用s[i] = '#'
  • 您的return語句處理方式錯誤:找到所需的內容后返回所需的指針,否則在檢查了整個字符串后返回0。
  • 您的上一次return沒有強制要求。 不要這樣做,因為強制類型轉換可以隱藏有關不兼容類型的警告和錯誤。

所以:

char *es_token(char *s, char c)
{
    int i = 0;

    while(s[i] != '#') {
        if (s[i] == c) {
            s[i] = '#';
            return &s[i + 1];
        }
        i++;
    }

    return NULL;
}

假設未保護字符串s的內存以防寫入(即,它不是字符串文字),則可以這樣操作:

if (s[i] == c){
   s[i] = '#';
   return &s[i+1]; // This produces a pointer to (i+1)'st character of s
} else {
    i++;
}

這將返回一個替換字符之后的字符指針。

演示

char *es_token(char *s, char c)
{
int i = 0;
while(s[i] != '#'){
    if (s[i] == c){
       s[i] = '#';
       return s+i+1;
    }
    i++;
}

return NULL;
}

指針只是內存中的一個位置。 如果返回s+i+1 ,編譯器將獲取地址s (字符串的開頭),並將i+1加到其中,計算出剛替換的位置的地址加1。

如果您發現c的字符或字符文字#則將您的代碼解釋為您要終止搜索。 然后:

char *es_token(char *s, char c) {
    int i = 0;
    while(s[i] != '#') { // as long as not #
        if (s[i] == c) { // if the current char is c
           s[i] = '#'; // change it to #
           break; // and stop searching
        }
    }
    // invariant: i is the position of a #
    return s+i+1; // +1 gets the position after
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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