我正在编写一个函数,用字符串中的'#'替换给定的字符。该函数应该返回一个指向刚刚替换字符后面的位置的指针。此外,字符串不以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);
}
我不知道在这种情况下如何返回指针。我非常感谢你的帮助。
答案 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++;
}
这将返回一个指向您替换后的角色的指针。
答案 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
}