注册 登录
编程论坛 C语言论坛

删除字符串中空格问题(第一个字母意外变成空格)

飞天大烧卖 发布于 2020-04-07 08:35, 3234 次点击
//删除在字符串中所有空格
int main(void)
{
    int i,j;
    char str[16]="a abc  abc  daf";//依次一个空格,2个空格,2个空格
    for(i=0;str[i] != '\0';i++)
    {
        if(str[i]==' ')//找到有空格的位置
        {
        for(j=i+1;str[i] != '\0';j++)
        {
            if(str[j]!=' ')//从有空格的位置往后找到第一个有字母的位置
            {
                str[i]=str[j];//把有字母的值赋到原先空格的位置
                str[j]=' ';//把原先的有数字的位置值赋值为空格
                break;
            }
        }
        }
     printf("%2c,%2d",str[0],i);
    }
    puts(str);
}




为什么在i为16的时候str[0]变成了空格?为什么字符数组会溢出,字符串末尾不是有默认结束符吗?
15 回复
#2
飞天大烧卖2020-04-07 08:40
我上传的图片可以看到吗?
结果是:
 a, 0 a, 1 a, 2 a, 3 a, 4 a, 5 a, 6 a, 8 a, 9 a, 10 a, 11 a, 12 a, 13 a, 14 a, 15  ,16 abcabcdaf
#3
吹水佬2020-04-07 09:17
#include <stdio.h>
int main(void)
{
    int i,j=0;
    char str[16]="a abc  abc  daf";//依次一个空格,2个空格,2个空格
    for(i=0;str[i] != '\0';i++)
    {
        if(str[i] != ' ')
            str[j++] = str[i];
    }
    str[j++] = '\0';
    puts(str);
}
#4
lin51616782020-04-07 10:07
以下是引用吹水佬在2020-4-7 09:17:09的发言:

#include <stdio.h>
int main(void)
{
    int i,j=0;
    char str[16]="a abc  abc  daf";//依次一个空格,2个空格,2个空格
    for(i=0;str != '\0';i++)
    {
        if(str != ' ')
            str[j++] = str;
    }
    str[j++] = '\0';
    puts(str);
}

看原来的代码 意思大概是 非空格原顺序摆前面 空格摆后面
你的处理空格都被删除了
计算空格个数 最后做一个memset
#5
飞天大烧卖2020-04-07 12:08
回复 4楼 lin5161678
所以为什么str[0]在i等于16的时候变成空格啊?
#6
wmf20142020-04-07 12:42
你代码出现的是溢出错误,“for(j=i+1;str[i] != '\0';j++)”循环条件明显问题,应该是“for(j=i+1;str[j] != '\0';j++)”。
#7
叶纤2020-04-07 13:46
3楼的代码好调皮呀,后置加加就像是一个顽皮的小孩,摸不清看不透
#8
吹水佬2020-04-07 14:36
以下是引用lin5161678在2020-4-7 10:07:27的发言:


看原来的代码 意思大概是 非空格原顺序摆前面 空格摆后面
你的处理空格都被删除了
计算空格个数 最后做一个memset

不是空格的往前移,没有将空格摆后面。
最好是先去到第一次出现空格的地方再去处理。
#9
lin51616782020-04-07 14:45
以下是引用吹水佬在2020-4-7 14:36:19的发言:


不是空格的往前移,没有将空格摆后面。
最好是先去到第一次出现空格的地方再去处理。

看代码注释
str[j] = ' ';
这里把空格摆到后面了

处理之前的字符串和处理之后的字符串
长度是一样的

[此贴子已经被作者于2020-4-7 14:53编辑过]

#10
飞天大烧卖2020-04-07 14:59
回复 6楼 wmf2014
我想找个磕头的表情没找到
#11
飞天大烧卖2020-04-07 15:02
多谢大家
#12
吹水佬2020-04-07 15:17
以下是引用lin5161678在2020-4-7 14:45:10的发言:


看代码注释
str[j] = ' ';
这里把空格摆到后面了

处理之前的字符串和处理之后的字符串
长度是一样的

那就文不对题,题目是“删除字符串中空格问题”,“删除”就意味着会变短。
#13
lin51616782020-04-07 15:20
以下是引用吹水佬在2020-4-7 15:17:45的发言:


那就文不对题,题目是“删除字符串中空格问题”,“删除”就意味着会变短。

嗯 的确
代码和标题没对上
#14
叶纤2020-04-07 15:35
楼主的思想是这样的
假设桌上有15个杯子,其中有一些没有装水,有一些装水了,乱序的排列
现在要做的是怎么把前面的空杯子补满水
楼主的想法是,遇见空杯子把后面的不是空杯子里面的水倒进空杯子里,然后把放回原位,然后再看后面的杯子里是否有水,有的话再把水倒进之前的空杯子里,
如果空杯子后面仍然是空杯子那就看后面的后面的杯子里有没有水,然后循环。。
其实杯子还是那个杯子,只是水往前移了,杯子并没有移动位置
,可是题目的意思是,水一但倒进前面的杯子,该空杯子要重桌子上取出来,直至桌子上没有空杯子
#15
飞天大烧卖2020-04-08 18:00
回复 14楼 叶纤
本来是懂的,看你一筐杯子就晕了
#16
叶纤2020-04-08 21:06
回复 15楼 飞天大烧卖
我是新手,这是我的专属理解方法,我叫它纤法
1