【问题标题】:Seg fault when trying to use strtok() on a 2D array尝试在二维数组上使用 strtok() 时出现段错误
【发布时间】:2011-09-26 22:21:09
【问题描述】:

我希望有人能帮我弄清楚为什么我在下面的代码中遇到了分段错误。我的用户输入了一行文本,将其传递给解析函数。 parse 函数应该初始化一个二维数组(理想情况下,我希望动态分配数组,但现在我将其设为大小为 [25][25] 的数组)。

input的开头开始调用strtok()。如果 strtok() 看到一个管道符号,它应该增加管道的数量并转到矩阵的下一行。例如,如果用户输入foo bar | foo1 | foo2 bar1 foo2,则二维数组将如下所示:

array[][] = { foo, barr;
              foo1;
              foo2, bar1, foo2; }

最终我想将此数组传递给另一个函数。但是,如果我实际上将上述内容输入到我的程序中,结果是这样的:

/home/ad/Documents> foo bar | foo1 | foo2 bar1 foo2
test1
Segmentation fault
ad@ad-laptop:~/Documents$

因此,考虑到我将这些调试语句放在哪里,问题在于保存令牌吗?这是我第一次使用二维数组,所以我确信我的指针逻辑有问题。我能做些什么来解决这个分段错误?感谢您的宝贵时间。

代码:

#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
   }
}

【问题讨论】:

  • 有人刚刚正确回答了我的问题,然后删除了帖子...我应该在第一个帖子之后调用 strtok(NULL, delims)
  • 我想我的答案是迟来的。
  • 抱歉,我认为我的大脑今天没有工作。当我再次查看您的代码时,我认为它被正确调用了。应该是星期一。很高兴你明白了。
  • 请注意,bzero 已过时。你应该使用memset

标签: c arrays segmentation-fault strtok


【解决方案1】:

只有第一次调用 strtok 才能接收输入。后续调用(在解析相同字符串时)应将 NULL 作为其第一个参数。

【讨论】:

    【解决方案2】:

    您误读了strtok 的联机帮助页:

    在应解析相同字符串的每个后续调用中,str 应为 NULL

    你做到了:tokenPtr = strtok(input, NULL);

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 2015-04-13
      • 2022-01-21
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2013-03-14
      相关资源
      最近更新 更多