我一直想弄清楚我的代码有什么问题。所以在任何地方进出我的代码,我想我找到了罪魁祸首。正是这一块代码导致了它
if (strcmp(input, "load 1") != 0 || strcmp(input, "load 2") != 0 || strcmp(input, "quit") != 0)
{
Player player;
Position position;
Direction direction;
char* tok;
char* firstInput=0;
char* secondInput=0;
char* thirdInput=0;
char* fourthInput=0;
int x;
int y;
char str[10];
char str2[10];
tok = strtok(input, " ");
strcpy(firstInput, tok);
tok = strtok(NULL, ", ");
strcpy(secondInput, tok);
tok = strtok(NULL, ", ");
strcpy(thirdInput, tok);
tok = strtok(NULL, "");
strcpy(fourthInput, tok);
strcpy(str, secondInput);
x = atoi(str);
strcpy(str2, thirdInput);
y = atoi(str2);
if(strcmp(firstInput, "init") == 0 )
{
if(x >= 0 && x <= 9)
{
if(y >= 0 && y <= 9)
{
if (strcmp(fourthInput,"north") == 0 || (strcmp(fourthInput,"south")) || (strcmp(fourthInput,"west") == 0) || (strcmp(fourthInput,"east") == 0))
{
position.x = x;
position.y = y;
if(strcmp(fourthInput,"north") == 0)
{
direction = NORTH;
}
if(strcmp(fourthInput,"south") == 0)
{
direction = SOUTH;
}
if(strcmp(fourthInput,"west") == 0)
{
direction = WEST;
}
if(strcmp(fourthInput,"east") == 0)
{
direction = EAST;
}
initialisePlayer(&player, &position, direction);
placePlayer(board, position);
displayDirection(direction);
}
}
}
}
}
据我所知,分段错误意味着内存问题。我确保有足够的空间容纳一切。究竟发生了什么?
答案 0 :(得分:1)
正如评论中所提到的,firstInput
及其兄弟姐妹没有任何内存分配到strcpy
到的地方。它们是NULL
,这会导致分段错误。
您可以分配内存或将这些变量设为本地数组,但您并不需要这样做。 strtok
返回指向input
的指针。只要input
未被覆盖,这些就有效。在将下一行读入input
之前,您只使用这些指针来分析当前行,这样就可以了。
摆脱中间人tok
并直接存储令牌的结果:
char* firstInput = NULL;
char* secondInput = NULL;
firstInput = strtok(input, " ");
if (firstInput) secondInput = strtok(NULL, ", ");
// analyse input
处理指针时,请确保在访问之前测试NULL
。无法保证用户输入恰好包含四个令牌(或任何令牌)。
答案 1 :(得分:0)
你可以从这里开始:
char* firstInput=0;
...
strcpy(firstInput, tok);
其中firstInput
仍为NULL,并且没有为其分配内存,但您尝试将tok
复制到其中。
使用malloc()分配内存,如下所示:
firstInput = malloc(sizeof(char) * (strlen(tok) + 1));
if (firstInput==NULL)
exit (1);
这可以帮助您开始调试。 :)