我的代码问题很少。有人知道可能出现什么问题吗?
我的代码:
FILE *tiedosto;
char tiedostonimi[] = "input.txt";
tiedosto = fopen (tiedostonimi, "r");
char luokka, kaupunki[4];
int kuutio, vuosi, kuukausi, paiva;
fscanf(tiedosto, "%i&energialuokka=%c&kaupunki=%s&Vuosi=%i&Kuukausi=%i&pva=%i", &kuutio, &luokka, &kaupunki, &vuosi, &kuukausi, &paiva);
printf("%d %c %s %d %d %d , kuutio, luokka, kaupunki, vuosi, kuukausi, paiva);
在txt文件中的行:
22&energialuokka=A&kaupunki=ei&Vuosi=2010&Kuukausi=02&pva=22
(" 22"" A"" ei"" 2010"" 02"" 22&# 34;不是永久价值..通过网站表格给出并保存到文本文件中)
当前
输出是:
22 u ei&Vuosi=2010&Kuukausi=02&pva=22 831192666 0 -163754450
答案 0 :(得分:2)
用C - "字符串扫描"不要使用address-of运算符(&
)。
所以这一行:
fscanf(tiedosto, "%i&energialuokka=%c&kaupunki=%s&Vuosi=%i&Kuukausi=%i&pva=%i", &kuutio, &luokka, &kaupunki, &vuosi, &kuukausi, &paiva);
应该是这样的:
fscanf(tiedosto, "%i&energialuokka=%c&kaupunki=%s&Vuosi=%i&Kuukausi=%i&pva=%i", &kuutio, &luokka, kaupunki, &vuosi, &kuukausi, &paiva);
这样做的背景是,如果使用没有索引运算符的数组变量,它(已经)衰减到指向其第一个元素(的地址)的指针。
答案 1 :(得分:2)
问题在于,当扫描字符串时,scanf
系列函数将扫描直到空白(或文件末尾,以先发生者为准)。扫描字符串时,您无法真正使用模式匹配。您可以通过检查fscanf
的返回值来非常简单地验证这一点,在您的情况下,它应该是3
(因为它扫描整数,一个字符,然后其余的作为单个字符串)。
顺便说一句,这当然会导致undefined behavior覆盖为字符串分配的数组相当大的余量,以及打印未初始化的局部变量的值。
相反,可能更好地对输入进行标记化(提示:请参阅strtok
函数),首先将其拆分为&符号'&'
,除了第一个值然后将另一个值拆分为相等字符'='
。然后检查每个"键"知道要设置什么值。