我编写了将字符串解析为单词的代码。这是代码。任何人都可以帮助解决运行时的分段错误错误吗?
打电话:
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)或网站,用指针学习这些字符串,并将字符串作为参数发送给函数吗?
答案 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 您为temp
和strcpy
分配了空间。
但是看起来你似乎永远不会使用它。
解释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;
}