2013-11-25 99 views
-1

我试图将软件移植到Linux。它在Windows上运行得非常好。 在Linux上它给我上的strcmp段故障:避免分段错误

int main(void) { 
    ... 
    char* comando; 
    char istruzione[100]; 
    scanf("%[^\n]%*c", istruzione); 
    comando = strtok(istruzione, " "); 
    if (strcmp(comando, "fput") == 0) 
    ... 
} 

问题消失使用数组符号,但我需要使用*符号,因为我需要使用strtok的,它返回一个*字符。

+7

什么是'istruzione'? –

+1

istruzione已经分配?它需要为scanf() – Greycon

+0

我忘了复制那部分代码。这是一个简单的字符数组。 –

回答

3

strtok可以返回NULL,这意味着你需要在strcmp中使用它之前检查它。

+0

做一个简单的检查并没有解决问题。 –

+0

做一个简单的检查会阻止你在strcmp中使用NULL指针,并导致段错误。你的支票显示了什么? –

+0

if(comando!= NULL){if(strcmp ......)} does not work? –

0

假设,istruzione是一个简单的字符缓冲区,我把下面的测试放在一起。我观察到的一件事情是,如果您只是按ENTER键作为scanf的输入,那么执行strcmp会导致分段错误。这是因为strtok返回NULL,因为没有任何标记。

在使用comando之前,您可能需要测试strtok是否返回NULL指针。你可以在下面的测试代码中看到我是如何做到这一点的。

scanf.c

#include <stdio.h> 
#include <string.h> 

char istruzione[256]; 

int main(void) { 
    char* comando; 
    scanf("%[^\n]%*c", istruzione); 

    comando = strtok(istruzione, " "); 

    /* test for NULL here */ 
    if (NULL != comando) 
    { 
     if (strcmp(comando, "fput") == 0) 
      printf("%s\n", comando); 
    } 

    return 0; 
} 
1

如同在C一般来说,经常检查您的返回值,并经常检查,通过一个函数返回一个指针是不是试图用它做任何事情之前NULL。

不知道在不知道程序输入的情况下可能产生此分段错误的情况,但我会非常强烈地建议您避免使用可能产生分段错误或更糟糕的scanf。在这里,你可以安全地做到这一点,而不是:

if (fgets(istruzione, 100, stdin) != NULL) { 
    comando = strtok(istruzione, " \n"); 
    if (comando != NULL) { 
     if (strcmp(comando, "fput") == 0) { 
      .... 

您正在使用的scanf调用读取一行文本而不复制换行符。 fgets会读取换行符,但您可以告知strtok将其作为另一个分隔符来忽略它。

+0

@OP - 请检查这个答案是否是你需要的。我建议你改变'fgets()'的所有'scanf()'调用。 – streppel

+0

已经试过用fgets没有成功。唯一的解决方案,但我不能接受,我发现是使用数组而不是指针。 –

+0

我想如果你需要更多的帮助,你需要提供一个完整的(小的)程序和导致它发生段错误的输入。 fgets应该防范不好的输入,所以我不认为这种代码会产生错误。 –