1

我认为关于字符串有一些我不理解的基本内容(C 的新手)。基本上我使用的是uthash,当我直接发送字符串而不是从循环发送字符串时它可以工作(即从数组中获取它的数据)。

这是一个例子:

enum { MAX_ID_LEN = 5 };
struct my_struct {
    char id[MAX_ID_LEN];                    /* key */
    float price;
    UT_hash_handle hh;         /* makes this structure hashable */
};
struct my_struct *users = NULL;

void new_stock(char *user_id, float price) {
    //printf("%c - %f \n", *user_id, price);
    struct my_struct *s;

    s = (struct my_struct*)malloc(sizeof(struct my_struct));
    strcpy(s->id, user_id);
    s->price = price;
    HASH_ADD_STR( users, id, s );  /* id: name of key field */
}
int main() {
    printf("starting.. \n");
    new_stock("IBM", 10.2);
    new_stock("goog", 2.2);
    return 0;
}

那行得通,但是当我尝试从数组中做同样的事情时,它却没有(编译时没有错误)。

char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char); 
float price_all[] =  {10.2, 2.2};

enum { MAX_ID_LEN = 5 };
struct my_struct {
    char id[MAX_ID_LEN];                    /* key */
    float price;
    UT_hash_handle hh;         /* makes this structure hashable */
};

struct my_struct *users = NULL;


void insert_data() {
    printf("inserting data \n");
    int data_loc;
    for (data_loc=0;data_loc<name_all_size;data_loc++) {
        //printf("%s - %f \n", name_all[data_loc], price_all[data_loc]);
        //new_stock(name_all[data_loc], price_all[data_loc]);
        //new try
        struct my_struct *s;
        s = (struct my_struct*)malloc(sizeof(struct my_struct));
        strcpy(s->id, name_all[data_loc]);
        s->price = price_all[data_loc];
        //printf("%s - %f \n", s->id, s->price); //ahh displays correctly but still fails
        HASH_ADD_STR( users, id, s );  /* id: name of key field */

    }
}

int main() {
    insert_data();
        return 0;
}

我是 C 的新手,所以我可能评估这个错误,但我认为这与我传递变量的方式有关。当我第一次尝试时,我将它发送到new_stock函数,但它只显示第一个字符,所以为了解决传递变量的问题,我只是将函数的所有内容移动到我用来添加所有数据的函数中到,但我仍然遇到同样的问题。

知道我做错了什么吗?

也只是出于个人兴趣,是否有任何工具可以警告我代码中的问题?我发现 gcc 很有帮助,但是一旦警告停止,我不知道如何进行故障排除。有什么东西可以帮助我更早地发现这样的问题(比 gcc 更冗长的东西)。不确定它是否可能但想问。

4

2 回答 2

3

这是你的错误:

char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);

该数组name_all是一个char指针数组,而不是char,因此如果您在具有 32 位指针的 32 位系统上只有 8 个字节,而在具有 64 位指针的 64 位系统上则只有 16 个字节。请记住,指向的字符串文字不存储在数组中,只有指向字符串文字的指针在数组中。你真正想要的是:

int name_all_size = sizeof(name_all)/sizeof(char*);
                                            ^^^^^ note the pointer type

这应该给你一个值2,它是 中元素的正确数量name_all

于 2012-06-05T17:45:14.460 回答
1
char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);

name_all是两个 的数组char*sizeof name_all也是如此2*sizeof(char*),通常是 8 位或 16 位,具体取决于您使用的是 32 位系统还是 64 位系统。sizeof(char)根据定义为 1。所以在

for (data_loc=0;data_loc<name_all_size;data_loc++) {
    //printf("%s - %f \n", name_all[data_loc], price_all[data_loc]);
    //new_stock(name_all[data_loc], price_all[data_loc]);
    //new try
    struct my_struct *s;
    s = (struct my_struct*)malloc(sizeof(struct my_struct));
    strcpy(s->id, name_all[data_loc]);
    s->price = price_all[data_loc];
    //printf("%s - %f \n", s->id, s->price); //ahh displays correctly but still fails
    HASH_ADD_STR( users, id, s );  /* id: name of key field */

}

您正在访问数组的末尾name_all

您的意思是除以sizeof(char*)inname_all_size吗?

于 2012-06-05T17:45:21.470 回答