我希望有人可以帮我弄清楚为什么我的代码在下面会出现分段错误。我的用户输入了一行文本,然后传递给解析函数。解析函数应该初始化一个2D数组(理想情况下我想动态分配数组,但是现在我将它变成一个大小为[25] [25]的数组)。
从input
strtok()的开头开始调用。如果strtok()看到管道符号,它应该增加管道数量并转到矩阵的下一行。例如,如果用户输入foo bar | foo1 | foo2 bar1 foo2
,则2D阵列将如下所示:
array[][] = { foo, barr;
foo1;
foo2, bar1, foo2; }
最终我想把这个数组传递给另一个函数。但是,如果我实际上将上述内容输入到我的程序中,结果就是:
/home/ad/Documents> foo bar | foo1 | foo2 bar1 foo2
test1
Segmentation fault
ad@ad-laptop:~/Documents$
因此,考虑到我放置这些调试语句的地方,问题在于保存令牌?这是我第一次使用2D数组,所以我确信我的指针逻辑有问题。我该怎么做才能解决这个分段错误?谢谢你的时间。
代码:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
int MAX_PATH_LENGTH = 1024; //Maximum path length to display.
int BUF_LENGTH = 1024; // Length of buffer to store user input
char * delims = "|"; // Delimiters for tokenizing user input.
const int PIPE_READ = 0;
const int PIPE_WRITE = 1;
void execute(char *args, int numPipes, int numArgs){
int i;
int j;
for(i = 0; i <= numArgs; i++){
for(j = 0; j < 25; j++){
printf("args[%d][%d]", i, j);
}
}
}
void parse(char *input) {
char argArray[25][25];
int numPipes = 0;
int i = 0;
int j = 0;
char *tokenPtr = NULL;
tokenPtr = strtok(input, delims);
while(tokenPtr != NULL) {
if(strcmp(tokenPtr, "|") == 0){ //is token a pipe?
numPipes++;
i++;
j = 0;
}
else {
argArray[i][j++] = *tokenPtr;
printf("test1\n");
tokenPtr = strtok(input, NULL);
printf("test2\n");
}
}
execute(*argArray, numPipes, i);
}
int main () {
char path[MAX_PATH_LENGTH];
char buf[BUF_LENGTH];
char* strArray[BUF_LENGTH];
while(1) {
getcwd(path, MAX_PATH_LENGTH);
printf("%s> ", path);
fflush(stdout);
fgets(buf, BUF_LENGTH, stdin);
parse(buf);
bzero(strArray, sizeof(strArray)); // clears array
}
}
答案 0 :(得分:2)
只有第一次调用strtok才能收到输入。后续调用(在解析相同的字符串时)应该将NULL作为其第一个参数。
答案 1 :(得分:1)
您误读了strtok
:
在应解析相同字符串的每个后续调用中,
str
应为NULL
。
你做了:tokenPtr = strtok(input, NULL);