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

在编一个提取字符串的程序时,发现了一个问题,希望有大神可以解答

rain9797 发布于 2020-04-18 23:40, 2319 次点击
#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',后面的所有元素都丢失了,这是怎么回事?
8 回复
#2
wmf20142020-04-19 00:17
要看到自己的逻辑错误,需要做各种测试,比如将字符串改成"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编辑过]

#3
吹水佬2020-04-19 06:06
#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;
}
#4
rain97972020-04-19 11:10
回复 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语言没学多久
#5
rain97972020-04-19 11:21
回复 3楼 吹水佬
学到了,感谢
#6
飞天大烧卖2020-04-19 11:24
tmp[10]:male000000
如l==1            如l==2
tmp[10]:00le000000    tmp[10]:000e000000
再次赋值
tmp[10]:25le000000    tmp[10]:250e000000(输出25)


#7
forever742020-04-19 12:09
回复 4楼 rain9797
逻辑值真兼容整数非0
逻辑值假兼容整数0
因此
a[j]就是a[j]!=0
!a[j]就是a[j]==0
#8
rain97972020-04-19 16:45
回复 6楼 飞天大烧卖
我想明白了,strcpy复制的是字符串,所以遇到0就终止了
#9
rain97972020-04-19 16:46
回复 7楼 forever74
明白了
1