使用strtok将stdin解析为数组

时间:2014-09-08 16:01:47

标签: c stdin strtok

每次代码到达第一个strtok时我都会遇到段错误

token = strtok(commandLine," ");

我只是尝试使用空格作为分隔符来解析stdin并将其存储起来。我看到很多问题是人们在字符串文字上使用strtok,我认为这也适用于我的情况,但我该如何解决呢? 感谢。

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

int main(int argc, char* argv[]){

    //Used for parsing
    char commandLine[255];
    char* tokens[10];
    char* token;
    int counter;
    int i;

    printf("gets to pt 1\n");
    //Parsing
    while( fgets(commandLine, 255, stdin) ){
        printf("\n%s\n", commandLine);
        token = strtok(commandLine," ");
        printf("gets here");
        counter = 0;
        for(counter = 0; token != NULL; counter++){
            strcpy(tokens[counter], token);
            token = strtok(NULL, " ");
        }   
    }
    printf("gets to point2");
    for(i = 0; tokens[i] != NULL; i++){
        printf("%s ", tokens[i]);
    }

编辑:

这是工作代码。

正如User93353指出的那样,我必须为我的令牌分配内存,所以我改变了

char* tokens[10] 

char tokens[10][100]

我的for循环没有正确结束,不得不改变

tokens[i] != NULL

i<counter

-

int main(int argc, char* argv[]){

    //Used for parsing
    char commandLine[255];
    char tokens[10][100];
    char* token;
    int counter;
    int i;

    printf("gets to pt 1\n");
    //Parsing
    while( fgets(commandLine, 255, stdin) ){
        printf("\n%s\n", commandLine);
        token = strtok(commandLine," ");
        printf("gets here");
        for(counter = 0; token != NULL; counter++){
            strcpy(tokens[counter], token);
            token = strtok(NULL, " ");
        }
        printf("gets to printing");
        for(i = 0; i<counter; i++){
            printf("%s", tokens[i]);
        }
    }


}

1 个答案:

答案 0 :(得分:1)

tokens数组的每个元素分配内存。

简单的方法是将其声明为

#define SOME_SIZE 100

char tokens[10][SOME_SIZE];

否则,tokens[0]tokens[1]等指向内存中的某个随机位置。 strcpy到该随机位置会导致程序崩溃。