| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2014 人关注过本帖
标题:在编一个提取字符串的程序时,发现了一个问题,希望有大神可以解答
只看楼主 加入收藏
rain9797
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-3-1
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
在编一个提取字符串的程序时,发现了一个问题,希望有大神可以解答
#include <stdio.h>
#include <string.h>
int main()
{
    char character[100]={"Fred male 25;John male 62;Anna female 16\0"};
    char c[9][10];
    int i=0,j=0,k=0,l=0;
    char tmp[10]="\0";
    while (true)
    {
        while (true)
        {
            
            tmp[k]=character[i];
            if (character[i+1]==';' || character[i+1]=='\0' || character[i+1]==' ')
            {
                strcpy(c[j],tmp);
                for (l=0;l<=2;l++)
                {
                    tmp[l]='\0';//将tmp重新初始化
                }
                k=0;//使k重新变为0,让tmp的下标再次从0开始
                i+=2;  
                break;
            }
            i++;
            k++;
        }
        j++;
        if (character[i-1]=='\0')
        {
            break;
        }
   
    }
    for (j=0;j<=8;j++)
    {
        i=0;
        while(c[j][i]!='\0')
        {
            printf("%c",c[j][i]);
            i++;
        }
        printf("\n");
    }
    return 0;
}
结果是这样的:
图片附件: 游客没有浏览图片的权限,请 登录注册

问题:在while循环内部的for循环那里,当l(是字母L的小写)可以取2及其以上的数时,运行结果都和上面是一样的(都是对的),但是当l<=1时,结果就是错的,这我能够接受,问题在于,当l<=2时,它的结果不应该是对的,即使l<=5也不应该是对的,给我感觉就像是tmp数组前三个元素被赋值为'\0',后面的所有元素都丢失了,这是怎么回事?
搜索更多相关主题的帖子: tmp while char 结果 character 
2020-04-18 23:40
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:7 
要看到自己的逻辑错误,需要做各种测试,比如将字符串改成"Fredabcdef male 25;John male 62;Anna female 16\0"时,就看到错误结果了。将部分代码修改如下,可以避免这个错误:
            if (character[i]==';' || character[i]=='\0' || character[i]==' ')
            {
                tmp[k]=0;
                strcpy(c[j],tmp);
                k=0;//使k重新变为0,让tmp的下标再次从0开始
                tmp[k]=0;
                i+=2;  
                break;
            }//在这种逻辑下,如果字符串中出现两个连续的空格或分号,结果又会不是想要的。

下述代码应该支持极端测试:
程序代码:
#include <stdio.h>
int main()
{
    char character[100]={"  ;Fredefg;  male 25;John male 62;Anna female 16!;;;;...\0"};
    char c[10][10];
    char a[]=" ,;.!";  //定义分隔符
    int i,j,k,l;
    for(i=k=l=0;character[i];i++)
    {
        for(j=0;a[j]&&a[j]!=character[i];j++);  //判断character当前位置是否为分隔符
        if(!a[j])
            c[k][l++]=character[i];             //不是分隔符则写进对应单词位置
        else
        {
            if(l)                               //是分隔符且有字符串写入则准备些下个单词
            {
                c[k][l]=0;
                k++;
                l=0;
            }
        }
    }
    c[k][l]=0;
    if(!l)k--;         
    for (j=0;j<=k;j++)printf("%s\n",c[j]);
    return 0;
}


[此贴子已经被作者于2020-4-19 00:54编辑过]


能编个毛线衣吗?
2020-04-19 00:17
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:5 
#include <stdio.h>
#include <string.h>
int main()
{
    char character[100]={"Fred male 25;John male 62;Anna female 16\0"};
    char s[100];
    int i=0;
    while (character[i])
    {
        if (sscanf(&character[i],"%[^ ;]",s)==1)
        {
            printf("%s\n", s);
            i += strlen(s);
        }
        else
            ++i;
    }
    return 0;
}
2020-04-19 06:06
rain9797
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-3-1
收藏
得分:0 
回复 2楼 wmf2014
上面修改后的代码我看到了,但是应该是i+=1才对,然后下面的极端测试,大致意思我懂了,但是一些细节我没理解到,可以帮我解释一下吗:
1.for(j=0;a[j]&&a[j]!=character[i];j++) 这一段没看懂:a[j]&&a[j]!=character[i]
2.if(!a[j]) !a[j]的意思是character[i]!=a[j],如果是自然语言我很好理解,可是直接一个!a[j]给我一种没有判断对象的感觉,还有下面的if(l) 和if(!l)看的我稀里糊涂的,原谅我学c语言没学多久
2020-04-19 11:10
rain9797
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-3-1
收藏
得分:0 
回复 3楼 吹水佬
学到了,感谢
2020-04-19 11:21
飞天大烧卖
Rank: 2
等 级:论坛游民
帖 子:45
专家分:27
注 册:2020-3-26
收藏
得分:4 
tmp[10]:male000000
如l==1            如l==2
tmp[10]:00le000000    tmp[10]:000e000000
再次赋值
tmp[10]:25le000000    tmp[10]:250e000000(输出25)


2020-04-19 11:24
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:4 
回复 4楼 rain9797
逻辑值真兼容整数非0
逻辑值假兼容整数0
因此
a[j]就是a[j]!=0
!a[j]就是a[j]==0

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-04-19 12:09
rain9797
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-3-1
收藏
得分:0 
回复 6楼 飞天大烧卖
我想明白了,strcpy复制的是字符串,所以遇到0就终止了
2020-04-19 16:45
rain9797
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-3-1
收藏
得分:0 
回复 7楼 forever74
明白了
2020-04-19 16:46
快速回复:在编一个提取字符串的程序时,发现了一个问题,希望有大神可以解答
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.118943 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved