C语言,删除输入的字符串中字符‘H’

#include<stdio.h>
main()
{
char s[80];
int i,j;
get(s);
for(i=j=0;s[i]!='\0';i++)
if(s[i]!='H')
s[j++]=s[i];
s[j]='\0';
puts(s);
}

程序中的
if(s[i]!='H')
s[j++]=s[i];
意思是如果s[i]不等于‘H’
s[j]=s[i] ;j++;
那s[j]='\0';是要放在什么时候用啊?

第1个回答  推荐于2016-05-04
s[j] = '\0'是在for循环完成之后的加上的,那个if管不到s[j] = '\0',因为没有大括号,所以s[j] = '\0',是在最后追问

#include
main()
{
char s[80];
int i,j;
get(s);
for(i=j=0;s[i]!='\0';i++)
if(s[i]!='H')
s[j++]=s[i];
ELSE
s[j]='\0';
puts(s);
}
程序可以这样认为吗?

追答

不行,=不能用else,'\0'是在字符串结束最后一位加上的,是字符串结束表示

追问

可是这个s[j]='\0';的意思不是将是s[j]替换成'\0'吗?
不懂程序中
删除输入的字符串中字符‘H’
是哪个语句,能标出来一下吗

追答

对啊,一个字符串的最后一位一定是这个,记住是最后一位,不然字符串就不是字符串
比如 a[] = "hello", a[5] 就是‘\0’,你的那个题目就是最后一个是'\0'
因为你的s[j] ='\0',此时的j已经是最后一位了,因为for循环已经完成了

追问

比如s[]={'A','B','H','C'}
然后运行程序
i=j=0;
s[0]!='H';
s[j]=s[i]; j++;i++;
s[1]!='H';
s[j]=s[i]; j++;i++;
s[2]='H';
s[j]='\0';
s[3]!='H';
s[j]=s[i]; j++;i++;
可以这样认为吗?
是不是当s[i]='H'的时候,就跳出for循环执行s[j]='\0';?
要不然怎么删除'H'啊

追答

s[2]='H';的时候
s[j]='\0';//你这个理解就错了,s[2] = 'H'时,if没成立,下面的s[j++] = s[i]就不执行,回到for循环i++了,相当于跳过这个'H'了,H没有复制到s[j++]里面,因为s[j++] = s[i]没有执行,也就是判断下一个了。
这句s[j] = '\0'是在for循环外面的,就是for循环执行完了,才执行

追问

那是什么时候把'H'给删除掉的啊?

追答

for(i=j=0;s[i]!='\0';i++)
{
if(s[i]!='H')
s[j++]=s[i];
} //这里相当于有大括号,s[j]= '\0'是在外面
s[j]='\0';
你比如{A,B,H,D,E};
相当于排队啊,‘H’在你的前面,你是'D','H'有事走了,你补到前面去了,本来s[2] ='H',现在s[2] = 'D'了

本回答被提问者采纳
第2个回答  2015-12-09
s[j]='\0'这句的意思是在j位置添加一个字符串结束符,显然,使用他的时机应该是在删除原字符串中所有的'H'后,再在新的字符串后面加一个'\0'的时候使用他追问

可是这个s[j]='\0';的意思不是将是s[j]替换成'\0'吗?
不懂程序中
删除输入的字符串中字符‘H’
是哪个语句,能标出来一下吗

追答

是的,不知你有没有注意到,j的值只有在s[i]不等于'H'的时候才会增加,这样在循环的时候就会出现一个现象,就是后面的值会覆盖前面的值,而忽略到'H',但是在最后的时候由于是用后面的值覆盖前面的值,那么后面的值时被保存下来的,这样,在循环结束之后,新的字符串肯定长度小于等于原来的字符串,这时就需要一个字符串结束符来告诉计算机这个新的字符串结束的位置,而这个位置就是最后的j的位置

#include<stdio.h>
main()
{
   char s[80];
    int i,j;
    get(s);
    for(i=j=0;s[i]!='\0';i++)//遍历数组
    {
        if(s[i]!='H')
        {
            s[j++]=s[i];//覆盖
        }
    }
    s[j]='\0';//添加结束符
    puts(s);
}

追问

比如s[]={'A','B','H','C'}
然后运行程序
i=j=0;
s[0]!='H';
s[j]=s[i]; j++;i++;
s[1]!='H';
s[j]=s[i]; j++;i++;
s[2]='H';
s[j]='\0';
s[3]!='H';
s[j]=s[i]; j++;i++;
可以这样认为吗?
是不是当s[i]='H'的时候,就跳出for循环执行s[j]='\0';?
要不然怎么删除'H'啊

追答

不是的呢,s[j]='\0'是在循环结束之后进行的,在s[2]=='H'的时候是i++,但是j的值是没有变化的
i=j=0;
s[0]!='H';
s[j]=s[i]; j++;i++;
s[1]!='H';
s[j]=s[i]; j++;i++;
s[2]=='H';i++;这个位置可以看到j已经小于i了
s[3]!='H';
s[j]=s[i]; j++;i++;
到此循环结束,循环结束后
s[j]='\0';

追问

明白,多谢!

追答

不客气...

相似回答