运行程序时出现分段错误

时间:2013-07-17 14:47:40

标签: c pointers segmentation-fault

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

打电话:

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)或网站,用指针学习这些字符串,并将字符串作为参数发送给函数吗?

3 个答案:

答案 0 :(得分:3)

您使用strtok错误。

(通常最好不要使用strtok来解决所有问题和陷阱。)

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


我也认为你使用orgs数组错了。 更改此作业

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

到此:

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

因为orgs是一个字符指针数组 orgs[x]是一个字符指针,它匹配strtok

的返回类型

相反,您指的是*orgs[x],这只是一个角色 所以你要做的是:

[character] = [character-pointer];

会导致“非常糟糕的事情”


最后,请注意,每次循环都会将列表 两次 递增。
所以基本上你只是填充偶数元素,使orgs的奇数元素保持未初始化。

每个循环只增加列表 一次

基本上,你想要这个:

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

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

PS 您为tempstrcpy分配了空间。
但是看起来你似乎永远不会使用它。
解释temp的用途,或删除它。

答案 1 :(得分:0)

char buf[MAX_LENTHS];

你还没有定义数组大小,i。即MAX_LENTHS应定义为

#define MAX_LENTHS 25

正如Paul R在评论中所说,你还需要初始化你的角色指针数组

char *options[MAX_ORGS];

有些东西。

答案 2 :(得分:-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;
}