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

时间:2015-04-24 10:11:39

标签: c string

我正在编写一个函数,用字符串中的'#'替换给定的字符。该函数应该返回一个指向刚刚替换字符后面的位置的指针。此外,字符串不以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);
}

我不知道在这种情况下如何返回指针。我非常感谢你的帮助。

4 个答案:

答案 0 :(得分:4)

指向C字符串i中字符char *s的指针是该条目的地址:

&s[i]

鉴于s[i]只是*(s + i)的简写,上述内容与以下内容相同:

s + i

您的代码存在其他问题:

  • putchar将一个chacater写入termnal。它不会替换字符串中的任何内容。为此,请使用s[i] = '#'
  • 你的return语句是错误的方法:当找到你要找的东西时返回所需的指针,否则,当你检查整个字符串时,返回所需的指针。
  • 你的最后一个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;
}

答案 1 :(得分:3)

假设您的字符串s的内存未受到保护(即它不是字符串文字),您可以这样做:

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

这将返回一个指向您替换后的角色的指针。

Demo.

答案 2 :(得分:1)

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,计算您刚刚替换的位置的地址,加上一个

答案 3 :(得分: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
}