【问题标题】:C - tokenise array of charsC - 标记字符数组
【发布时间】:2011-11-05 18:55:37
【问题描述】:

我正在尝试解析一行,以便将空格后的每个单词作为 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++;
}

【问题讨论】:

  • 启用编译器警告..您想要单词列表吗?那是 char* array[50];

标签: c parsing


【解决方案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;
}

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

【讨论】:

    【解决方案2】:
    #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
    */
    

    【讨论】:

    • 是什么让您认为 main() 返回 void?为什么将 malloc()s 转换为返回值?为什么要包含非标准头文件
    • 这与他对strtok的使用无关。
    • 如果你真的关心我的程序的可移植性,我想首先我应该提到 strdup。
    猜你喜欢
    • 2023-03-16
    • 2018-03-23
    • 2017-08-25
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多