我必须阅读文件上的一些配置才能完成大学的项目。 在我的读取函数中,我使用一个结构来存储配置,但是,我不知道为什么,其中一个变量在读取下一个参数时会更改其值。
struct client_config{
char name[20]; //en teoria son 6 + '\0'
char MAC[12];
char server[20];
int UDPport;
};
void read_software_config_file(struct client_config *config){
FILE *conf;
conf = fopen(software_config_file, "r");
if(conf == NULL){
fprintf(stderr, "Error obrir arxiu");
exit(-1);
}
char word[1024];
int i=0;
fscanf(conf, "%s", word);
fscanf(conf, "%s", word); /* No es la millor manera de fer-ho... pero ja que suposem que el fitxer es correcte*/ strcpy(config->name, word); /* Ens saltem les comprovacions */
fscanf(conf, "%s", word);
fscanf(conf, "%s", word);
strcpy(config->MAC, word);
printf("%s this is config->mac after first read \n", config->MAC);
fscanf(conf, "%s", word);
fscanf(conf, "%s", word);
strcpy(config->server, word);
printf("%s this is config->mac after next read \n", config->MAC);
fscanf(conf, "%s", word);
fscanf(conf, "%s", word);
config->UDPport = atoi(word);
fclose(conf);
}
输出:
89F107457A36这是config-> mac,第一次读取后正确(这是正确的)
89F107457A36localhost,这是config-> mac,下次读取后不正确(这是不正确的)
我正在读取的文件是这样的:
Nom SW-01
MAC 89F107457A36
Server localhost
Server-port 2019
答案 0 :(得分:2)
在'\0'
字段中没有空格来终止MAC
。
第一次复制到MAC
字段时,printf
在'\0'
字段中找到终止的server
。复制到server
后,server
中的字符紧随MAC
中的字符之后,而在两者之间没有终止'\0'
。
您至少需要
struct client_config{
char name[20]; //en teoria son 6 + '\0'
char MAC[13]; // 12 characters + '\0'
char server[20];
int UDPport;
};
您还应该检查strcpy
复制的内容不多于结构字段的可用内存。也许使用strncpy
代替strcpy
,但是要确保结果以'\0'
终止。 (请阅读strncpy
的文档。)
答案 1 :(得分:2)
问题是MAC字段中没有空格可容纳结尾的\0
字符。 C中的所有字符串都必须比实际数据长一个字符。
为了使读数更安全,我建议对fscanf使用最大长度。像这样:
fscanf(conf, "%12s", word);
或更妙的是,使用fgets
。可以很容易地使用变量或常量来获得最大长度。
fgets(word, MAXLENGTH, conf);
答案 2 :(得分:1)
您的MAC字段似乎正好包含12个字符,而尾随的0个字符没有位置,因此在打印过程中将直接附加以下服务器。
答案 3 :(得分:0)
检查 struct client_config 成员的大小,不要忘记考虑字符串空终止符“ \ 0”。
别忘了用零之前初始化 struct client_config 结构。