0

我已经编写了将字符串解析为单词的代码。这是代码。任何人都可以在这里帮助解决运行时的分段错误错误吗?

打电话的乐趣:

int main()
{
    int count = 0, i;           // count to hold numbr of words in the string line.

    char buf[MAX_LENTHS];   // buffer to hold the string

    char *options[MAX_ORGS]; // options to hold the words that we got after parsing.

    printf("enter string");

    scanf("%s",buf);

    count = parser(buf,options); // calling parser

    for(i = 0; i < count; ++i)

    printf("option %d is %s", i, options[i]);

    return 0;  
}

调用函数:

int parser(char str[], char *orgs[])
{
    char temp[1000];//(char *)malloc(strlen(str)*sizeof(char));
    int list = 0;

    strcpy(temp, str);

    *orgs[list]=strtok(str, " \t ");

    while(((*orgs[list++]=strtok(str," \t"))!=NULL)&&MAX_ORGS>list)
        list++;

    printf("count =%d",list);

    return list;

}

注意:这些天我正在尝试学习 C,任何人都可以帮助获得一个好的教程(pdf)或网站来学习这些带有指针的字符串,并将字符串作为参数发送给函数吗?

4

3 回答 3

3

你用strtok错了。

(通常最好不要使用strtok它,因为它的所有问题和陷阱。)

如果必须使用它,正确的使用方法是使用strtok要“标记化”的字符串调用它一次,然后使用 NULL 一次又一次地调用它,以指示继续解析原始字符串。


我也认为您使用orgs错误的数组。更改此作业

*orgs[list++]=strtok(str, " \t ");

对此:

orgs[list++]=strtok(str, " \t ");

因为orgs是一个字符指针数组。
orgs[x]是一个字符指针,它匹配的返回类型strtok

相反,您指的是*orgs[x],这只是一个字符。
所以你正在尝试做:

[character] = [character-pointer];

这将导致"very-bad-things™"


最后,请注意,您每次循环都会增加 list两次。
所以基本上你只填写偶数元素,而未初始化 orgs 的奇数元素。

每个循环 只增加一次列表。

基本上,你想要这个:

orgs[list++] = strtok(str, " \t ");

while(( (orgs[list++] = strtok(NULL," \t")) !=NULL) && MAX_ORGS > list)
    /* do nothing */;

PStemp你为,分配空间strcpy
但是看起来你从来没有使用过它。
解释什么temp是为了,或删除它。

于 2013-07-17T14:54:43.787 回答
0

char buf[MAX_LENTHS];

您尚未定义数组大小,即MAX_LENTHS应该定义为

#define MAX_LENTHS 25

正如 Paul R 在他的评论中所说,您还需要初始化字符指针数组

char *options[MAX_ORGS];

有东西。

于 2013-07-17T14:52:48.170 回答
-1
int parser(char str[], char *orgs[]){
    int list=0;

    orgs[list]=strtok(str, " \t\n");
    while(orgs[list]!=NULL && ++list < MAX_ORGS)
        orgs[list]=strtok(NULL," \t\n");
    printf("count = %d\n",list);
    return list;
}
int main(){
    int count=0,i;
    char buf[MAX_LENTHS];
    char *options[MAX_ORGS];
    printf("enter string: ");
    fgets(buf, sizeof(buf), stdin);//input include space character
    count=parser(buf,options);
    for(i=0;i<count;++i)
        printf("option %d is %s\n",i,options[i]);
    return 0;
}
于 2013-07-17T15:07:34.280 回答