从fgets中删除换行符 - 不断出现seg错误

时间:2014-05-25 22:36:03

标签: c fgets strtok

我试图从命令行解析输入,但在我的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);
}

3 个答案:

答案 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';
}

Here is a demo on ideone.

答案 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必须在最后解雇它或在开始时调用它。这种技术的缺点是你无法返回阵列,但你似乎无法做到。

我希望我能提供帮助。