c - 警告 TokenList 类型转换

标签 c struct casting token compiler-warnings

我有这个:

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

在“l->next = s[i];”中我收到警告:赋值使指针来自整数而不进行强制转换[默认启用]。 我已经尝试过多次更改它,但我遇到了一些问题,我的C语言不太好。我应该如何更改它? 谢谢。

编辑:我想要这样的东西来构建逆波兰表示法计算器:

tokenize("12 17 + 4 3 -/") = "12"-> "17"-> "+"-> "4"-> "3"-> "-"-> "/"-> 空

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

这是该程序的第一部分。

最佳答案

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

关于c - 警告 TokenList 类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22982985/

相关文章:

C# - 如何在没有 IDE/Visual Studio 的情况下制作程序?

c - 内存对齐64是什么意思?是不是地址间隔64字节?

c++ - 低内存图像调整大小

c - 读取数据到文本文件并保留N个字符的输出

c++ - getprocaddress 的类似功能使用结构?

c++ - 将整数转换为字符数组,然后再将其转换回来

C++ 将 pair<int,int> 的 vector 复制到 vector<int>

c - 如何创建新队列

c# - C# 中 C++ 的等效数据类型

Java多线程套接字客户端/服务器: sending and receiving Enummap objects