C 运行程序时出现分段错误

C 运行程序时出现分段错误,c,pointers,segmentation-fault,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 ho

我已经编写了将字符串解析为单词的代码。这是代码。在运行时,有人可以帮助修复分段错误吗

呼叫乐趣:

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;  
}

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

您尚未定义数组大小,即。e<代码>最大长度的定义如下

#定义最大长度25

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

char*选项[MAX_ORGS]


用什么东西

您使用的strtok
错误

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

如果必须使用它,使用strtok的正确方法是使用要“标记化”的字符串调用它一次, 然后反复调用它,并使用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
temp
分配空间,并将
strcpy
放入其中。
但是看起来你从来没有使用过它。
解释
temp
的用途,或者删除它。

int解析器(char str[],char*orgs[]){
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;
}
int list=0; orgs[list]=strtok(str,“\t\n”); while(orgs[list]!=NULL&&++list对于(i=0;i使用-g编译用于调试符号,然后在GDB中运行它,它将告诉您它出现故障的行。您尚未为
char*options[MAX\u ORGS]
-它只包含未初始化的(即垃圾)指针。@Srinivas Thanneeru,我使用C学习过,但我猜它现在是一个旧文本(如果修改过的话)亚马逊上的101英镑!或使用了5英镑…而且,这是一个非常好的参考,提供了非常好的函数使用示例-请查看
strtok
。不,如果它编译了,那么它必须被定义。它相当于1。Paul R.在他的评论中指出的,2。该操作-遵循通常的错误做法-并没有真正发布完整的代码。@H2CO3然后我问ss,OP也应该得到-1:)+1但是在你上一个代码示例中,在存储第一个
strtok
的结果之后,在存储第二个
strtok
的结果之前,必须先增加
列表中的值。@IngoLeonhardt:捕捉得好。修复了。谢谢。谢谢大家。有人能帮你了解一本好书或一些电子副本来学习所有这些关于指针的知识吗?@IngoLeonhar先生dt.我修正了你在这里说的所有内容,但问题是我得到的是相同的单词,而不是字符串中的不同单词,例如:HI-im-MASTER.o/p:HI-HI-HI-HI-HI..因为我使用while((*orgs[list++]=strtok(str,“\t”)!=NULL)和&MAX\u-orgs>list),在这种情况下,我又遇到了段错误。@SrinivasThanneeru再次查看答案:您必须先使用参数
str
调用
strtok
,然后使用
NULL
调用。我没有投反对票,但我想您应该添加一句话来解释您是如何修复的。问题是什么,等等。如果没有解释,好的而不是程序中的一个缺陷。我想,我还没有检查。但我必须(用眼睛)做一个差异,以找出差异。这对那些只想避免犯同样错误的人来说不是很有帮助(如果我们不知道错误是什么,也不知道为什么).出于同样的原因投了反对票。请解释你的答案。嗯,永远不足以夸大评论。然后,你就会知道(仅仅是误解)斯特托克。我认为,从比较中可以清楚地看出改进的原因,因为它将尽可能地改进原始版本。
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;
}