C - 标记的字符数组

时间:2011-11-05 18:55:38

标签: c parsing

我正在尝试解析一行,以便将空白后的每个单词作为char分别保存到数组中。我试过多种方式,这是其中之一......

char space[] = " ";
char* token;  
token = strtok(input,space);
char array[50];


while (token !=NULL ) {
    char a;
    sscanf(token,"%s", &a);
    array[i] = a;
    token = strtok(NULL, space);
    printf("\nTOKEN: %s", a); 
    int++;
}

2 个答案:

答案 0 :(得分:1)

char a;
sscanf(token,"%s", &a);

这是错的,你告诉sscanf读取一个字符串但你给它一个char。 “单词”不适合单个char。它不是很清楚你想要做什么,也许你想要这样的东西:

char* array[50];

int i = 0;
for( char* token = strtok( input, " " ); token != NULL && i < 50; token = strotok( NULL, " " ) )
{
    array[ i ] = token;
    ++i;
}

这将填充array指向input内由空格分隔的每个子字符串的指针。原始内容将保留在input上,数组仅指向它。

答案 1 :(得分:0)

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

typedef char** StringArray;

StringArray split(const char *str, const char *delimiter){
    char *text, *p, *first, **array;
    int c;
    StringArray ret;

    text=strdup(str);
    if(text==NULL) return NULL;
    for(c=0,p=text;NULL!=(p=strtok(p, delimiter));p=NULL, c++)//count item
        if(c==0) first=p; //first token top

    ret=(StringArray)malloc(sizeof(char*)*(c+1));//+1 for NULL
    if(ret==NULL){
        free(text);
        return NULL;
    }
    strcpy(text, str+(first-text));//skip until top token
    array=ret;

    for(p=text;NULL!=(p=strtok(p, delimiter));p=NULL){
        *array++=p;
    }
    *array=NULL;
    return ret;
}

void free4split(StringArray sa){
    char **array=sa;

    if(sa!=NULL){
        free(array[0]);//for text
        free(sa);      //for array
    }
}

int main(void){
    char *str = "The quick brown fox jumps over the lazy dog";
    StringArray words;
    char **wk;

    words = split(str, " \t\r\n");

    for(wk = words; *wk ;wk++){
        printf("%s\n", *wk);
    }

    free4split(words);
    return 0;
}
/* result
The
quick
brown
fox
jumps
over
the
lazy
dog
*/