我正在尝试将软件移植到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。
答案 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指针。您可以在以下测试代码中看到我是如何做到的。
#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;
}