我花了很长时间试图找出以下程序的问题所在:
typedef struct user {
char host[40];
int order;
} user;
typedef struct data {
user userdat;
} data;
int read_user (char *datname, user *userdat) {
...
fscanf (datin, "%s", &userdat->host);
fscanf (datin, "%d", &userdat->order);
//1
printf ("%d\n", userdat->order);
...
}
void init_data (data *dat) {
init_userdat (&dat->userdat);
}
void init_userdat (user *userdat) {
*userdat->host = "127.0.0.1";
userdat->order = 0;
}
int user_print (int i, data *dat) {
//2
printf ("%d\n", dat->userdat.order);
}
int main(int argc, char *argv[]) {
...
data dat;
init_data (&dat);
read_user (datname, &dat->userdat);
user_print (&dat);
}
程序非常简化,以突出相关部分。情况是第一个打印语句(//1)可以正确输出值,而第二个打印语句(//2)无法输出正确的值 - 它输出了一些类似于可能的内存位置的东西。
我尝试了许多访问存储变量的组合,但我就是搞不定它。任何帮助将不胜感激。
编辑1:修正了代码中的一些非必要错误(与指针或结构体无关)
最终编辑:谢谢大家的帮助。Arun Saha指出的问题确实存在于原始代码中,现在已经解决。然而,打印两个不同字符串的问题仍然存在。你们对代码应该能够编译和工作的保证导致我发现了真正的罪魁祸首 - 我没有正确初始化复杂结构的另一部分,这导致了用户.order变量的覆盖。
datname
在主函数中是什么? - Aruninit_user()
了。 - chrisfscanf()
调用成功。并且请确保您的代码可以编译(例如使用/* ... */
或// ...
表示缺失的代码)。请了解如何创建 SSCCE(简短、自包含、正确的示例)。在提交代码之前,请确保您的代码可以干净地编译,或者将您的问题描述为“如何修复这个编译警告”。请记住,此时您的编译器比您更了解 C 语言。相信它;它比您更有可能是正确的。(相信我,我也相信编译器会在我犯傻的时候告诉我!) - Jonathan Leffler