2014-04-10 33 views
0

我有這樣的:警告TokenList型投

struct cella { 
    char *token; 
    struct cella *next; 
}; 
typedef struct cella *ListaToken; 

ListaToken tokenize(char *s) { 
    ListaToken l; 
    int i; 
    while (s[i]){ 
     l = (ListaToken)malloc(sizeof(ListaToken)); 
     l->next = s[i]; 
     i++; 
    } 
    l->next = NULL; 
    return l; 
} 

在 「1->下一= S [I];」我得到了警告:賦值使得整型指針沒有轉換[缺省情況下啓用]。 我試過多次改變它,但是我有一些問題,我不擅長C.我應該如何改變它? 謝謝。

編輯:我想是這樣的,以建立一個逆波蘭表示法計算器:

記號化( 「12 17 + 4 3 - /」)= 「12」 - > 「17」 - > 「+」 - >「4」 - >「3」 - >「 - 」 - >「/」 - > NULL

tokenize(「12 17 + 4 - /」)=「12」 - >「17」 - > 「 - >」4「 - >」 - 「 - >」/「 - > NULL

這是程序的第一部分。

+2

'1-> next'是指針'結構cella'不'char'。所以它不會工作。 你想建立一個鏈接列表,每個節點有一個字符從字符串? – GoldRoger

+0

你的意思是'l-> token = s [i];'? – bioffe

+0

我已經添加了一些這個小代碼應該做的例子。 – Folie17

回答

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

typedef struct cella { 
    char *token; 
    struct cella *next; 
} *ListaToken; 

ListaToken tokenize(const char *s) { 
    ListaToken top = NULL, current, l; 
    char *p, *tmps = strdup(s); 

    for(p=strtok(tmps, " ");p;p=strtok(NULL, " ")){ 
     l = malloc(sizeof(*l)); 
     l->token = strdup(p); 
     l->next = NULL; 
     if(top == NULL){ 
      current = top = l; 
     } else { 
      current->next = l; 
      current = l; 
     } 
    } 
    free(tmps); 
    return top; 
} 

void print(ListaToken l){ 
    while(l){ 
     printf("\"%s\" -> ", l->token); 
     l = l->next; 
    } 
    printf("NULL\n"); 
} 
int main(){ 
    ListaToken list1, list2; 
    list1 = tokenize("12 17 + 4 3 - /"); 
    print(list1); 
    list2 = tokenize("12 17 + 4 - /"); 
    print(list2); 

    return 0; 
} 

char *mystrdup(const char *s){ 
    char *dup = malloc(strlen(s) + 1); 
    return strcpy(dup, s); 
} 

char *mystrtok_r(char *str, const char *delims, char **store){ 
    char *p, *wk; 
    if(str != NULL){ 
     *store = str; 
    } 
    if(*store == NULL) return NULL; 
    *store += strspn(*store, delims);//skip delimiter 
    if(**store == '\0') return NULL; 
    p=strpbrk(wk=*store, delims); 
    if(p != NULL){ 
     *p='\0'; 
     *store = p + 1; 
    } else { 
     *store = NULL; 
    } 
    return wk; 
} 

char *mystrtok(char *str, const char *delimis){ 
    static char *store; 
    return mystrtok_r(str, delimis, &store); 
} 

ListaToken tokenize(const char *s) { 
    ListaToken top = NULL, current, l; 
    const char *p = s, token[16]; 
    int len=0; 
    while(1==sscanf(p, "%15s%n", token, &len)){ 
     l = malloc(sizeof(*l)); 
     l->token = malloc(len + 1); 
     strcpy(l->token, token); 
     p += len; 
     l->next = NULL; 
     if(top == NULL){ 
      current = top = l; 
     } else { 
      current->next = l; 
      current = l; 
     } 
    } 
    return top; 
} 
+0

有一種方法可以在不使用string.h的情況下實現它? 感謝順便說一句,它的工作原理,但我不能使用該庫:( – Folie17

+0

@ Folie17你不得不說'strdup'? – BLUEPIXY

+0

的strdup和strtok的,沒錯 – Folie17