避免分段错误

时间:2013-11-25 18:31:01

标签: c linux segmentation-fault scanf strcmp

我正在尝试将软件移植到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,它返回一个* char。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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将其视为另一个分隔符,以便忽略它。

答案 2 :(得分:0)

假设istruzione是一个简单的char缓冲区,我将以下测试放在一起。我观察到的一件事是,如果你只是按ENTER键作为scanf的输入,那么strcmp会导致分段错误。这是因为strtok返回NULL,因为没有什么可以标记化。

在使用strtok之前,您可能需要测试comando是否返回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;
}