我试图从命令行解析输入,但在我的C程序中不断出现seg错误。关于问题在哪里的任何想法?现在我想摆脱用户输入结束时的\n
。
void assign_to_array(char *command){
char *in;
int len;
char *pos;
char **info = calloc(10,sizeof(char*));
for(int i=0;i<10;i++){
info[i]=calloc(50,sizeof(char));
}
in = strtok(command," ");
if((pos=strchr(in,'\n')) != NULL)
*pos='\0';
while (in != NULL){
in = strtok(NULL," ");
if((pos=strchr(in,'\n')) != NULL)
*pos='\0';
}
for(int i=0;i<3;i++)
free(info[i]);
free(info);
}
答案 0 :(得分:2)
重新分配strchr
后,您的代码正在调用in
,而不检查NULL
。
以下是解决此问题的方法:
while (in != NULL){
in = strtok(NULL," ");
if (in == NULL) break; // <<== Add this line
if((pos=strchr(in,'\n')) != NULL) *pos='\0';
}
答案 1 :(得分:1)
char *pos;
pos = strchr(command, '\n');
if (pos) *pos = '\0';
然后您可以在以后检查'\ n'时删除所有这些内容,如果您仍然遇到分段错误,则问题出在其他地方。
答案 2 :(得分:0)
有一些事情可以检查,以确保不会发生段错误。 这是主要的事情:
while (in != NULL){
in = strtok(NULL," ");
if((pos=strchr(in,'\n')) != NULL) *pos='\0';
}
当你这样做时,你要检查&#39;在&#39;在while循环的输入处没有指向NULL。但你确实修改了&#39;指向的内存区域。在循环中,您可以在此之后使用它。 这是一个解决方案:
in = strtok(NULL," ");
while (in != NULL)
{
if((pos=strchr(in,'\n')) != NULL) *pos='\0';
in = strtok(NULL," ");
}
所以&#39; in&#39;在使用之前每隔一段时间检查一次。
接下来的几件事:
您使用calloc(3)时甚至没有检查返回值是否为NULL。你应该总是检查返回值。如果您的机器内存不足怎么办?你会崩溃......
char **info = calloc(10,sizeof(char*));
if (info == NULL) return;
for(int i=0;i<10;i++){
info[i]=calloc(50,sizeof(char));
if (info[i] == NULL)
return;
}
您无法返回错误值,因为函数assign_to_array是&#39; void&#39;类型。我仍然建议这个函数应该返回一个int或者什么来避免任何副作用。
此外,您还要分配一个包含10个字符串的数组,每个字符串包含50个字符(您实际上并未使用这些字符...)。最后,你只能释放前3个字符串。
如果这个数组每次等于10个50个字符的字符串,我建议不要使用calloc,而只是在堆栈上创建它(比如这个char信息[10] [50];)这样你就不会#39 ; t必须在最后解雇它或在开始时调用它。这种技术的缺点是你无法返回阵列,但你似乎无法做到。
我希望我能提供帮助。