问题描述
我正在解决一本C编程书籍中的一些问题,以复习Strings。我不知道为什么我的解决方案无法正常工作。
问题要求编写一个名为censor的函数,该函数通过将foo的每次出现都替换为xxx来修改字符串。
我的代码:
int main()
{
char msg[] = "I love food,you fool.";
censor(msg);
puts(msg);
return 0;
}
void censor(char *str) {
char *c = str;
while (c+2 != '\0') {
if (*c == 'f' && *(c+1) == 'o' && *(c+2) == 'o')
*c = *(c+1) = *(c+2) = 'x';
c++;
}
}
我发现while循环运行了大约1700次。我很确定msg []会在字符串的结尾自动包含一个空字符。
解决方法
您要检查 pointer 的值,而不是它指向的值。所以代替这个:
/home/pj/twittAnestProj/data.csv
您想要这个:
while (c+2 != '\0') {
,
如果我已正确理解,您可能尚未使用标准的C字符串函数,而函数censor
应该使用指针编写。
对于初学者来说,这样的字符串函数应返回一个指向修改后的字符串的指针。也就是说,函数返回类型应为char *
而不是void
。
while循环中的条件
while (c+2 != '\0') {
等同于
while (c+2 != NULL) {
因为表达式c + 2
的指针类型为char *
。因此条件不正确。
此外,如果您甚至会更改条件,例如
while ( *( c+2 ) != '\0') {
如果用户传递的字符串少于两个字符,则循环可能具有不确定的行为。
可以定义该功能,如下面的演示程序所示。
#include <stdio.h>
char * censor( char *s )
{
const char *s1 = "foo";
const char *s2 = "xxx";
for ( char *p = s; *p; )
{
const char *t1 = s1;
while ( *t1 && *t1 == *p )
{
++t1; ++p;
}
p -= t1 - s1;
if ( *t1 == '\0' )
{
for ( const char *t2 =s2; *t2; ++t2 )
{
*p++ = *t2;
}
}
else
{
++p;
}
}
return s;
}
int main( void )
{
char msg[] = "I love food,you fool.";
puts( msg );
puts( censor( msg ) );
return 0;
}
程序输出为
I love food,you fool.
I love xxxd,you xxxl
所示函数的代码不依赖于字符串"foo"
和"xxx"
。指针s1
和s2
可以用长度相等的任何其他字符串初始化。