我认为有一些基本的东西,我不理解(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更冗长)。不确定是否可能,但想问。
答案 0 :(得分:3)
这是你的错误:
char *name_all[] = {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);
数组name_all
是一个char
指针数组,而不是char
,因此如果您使用的是32位32位系统,则只有8个字节指针,64位系统上的16位字节和64位指针。请记住,指向的字符串文字不存储在数组中,只有指向字符串文字的指针位于数组中。你真正想要的是:
int name_all_size = sizeof(name_all)/sizeof(char*);
^^^^^ note the pointer type
这应该为您提供2
的值,这是name_all
中正确的元素数。
答案 1 :(得分: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*)
中除以name_all_size
吗?