【发布时间】:2020-02-24 15:53:53
【问题描述】:
当我的一个朋友让我调试控制台游戏项目的问题时,我发现了一个奇怪的 C 语言中的 fprintf 转换,我无法弄清楚。该项目需要跟踪所有信息,包括分数和使用 C 更新到 .txt 文件的时间。
-初始化
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
.
.
.
// in main
time_t timer;
time (&timer);
int num=0,c;
scanf(" %s %ld", inputname,c);
fscanf(fp, "%d", &num);
num++;
char **name;
long *times;
ull *score;
name = new char *[num];
for(int i=0; i<num; i++){
name[i] = new char[MAX];
}
times = new long [num];
score = new ull[num];
//new data
name[num-1] = inputname;
score[num-1] = c;
times[num-1] = timer;
-I/O 部分
.
.
.
// input from file after dynamic variables have fix size
for(int i=0; i<num-1; i++){
fscanf(fp, " %s%d", name[i], &score[i]);
fscanf(fp, "%ld", ×[i]);
}
fseek(fp , 0 , SEEK_SET);
fprintf(fp, "%d\n", num);
//print back to fp
for(int i=0; i<num; i++){
fprintf(fp, "%s %ld ",name[i], score[i]);
fprintf(fp, "%ld\n",times[i]);
}
问题。如果我改变了
fprintf(fp, "%s %ld ",name[i], score[i]);
fprintf(fp, "%ld\n",times[i]);
单行
fprintf(fp, "%s %ld %ld\n",name[i], score[i],times[i]);
输出文件将有
NAME1 SCORE1 TIMEINLONG1
NAME2 SCORE2 0
NAME3 SCORE3 0
.
.
.
而不是
NAME1 SCORE1 TIMEINLONG1
NAME2 SCORE2 TIMEINLONG2
.
.
.
经过一番尝试,我发现通过颠倒分数和时间的顺序
fprintf(fp, "%s %ld %ld\n",name[i], times[i],score[i]);
我有正确的输出
NAME1 TIMEINLONG1 SCORE1
.
.
.
再次。
那么,C 究竟如何处理输出流。我以为编译器会收集"..." 中的参数来组装一个字符串,然后将其刷新到输出流。显然它忽略了第一个(时间[0])之后的时间[i]。
是我初始化时间[]的方式的问题吗? 还是 fprintf() 的问题?
为这么长的页面道歉,但我现在对fprint 感到很困惑。
已解决
将标题从“fprintf with dynamic memory”编辑为“long long int don't take long int well, 反之亦然。”
问题不在于动态内存的东西(对不起,我不知道),而是我用来获取数据并将数据放入 printf、fprintf、scanf、fscanf 的类型。根据@Adrian Mole 的说法,mismatch 将 long int 分配给 long long int 类型变量是未定义的行为,以下 I/O 操作将无法正确完成。好像long long int比long long有更多空间,不兼容。
没有
long long int c;
scanf("%d",&c);
printf("%d",c);
//or
scanf("%ld",&c);
printf("%ld",c);
是的
long long int c;
scanf("%lld",&c);
printf("%lld",c);
【问题讨论】:
-
你在使用指针时不一致。 scanf 接受一个指针地址。
-
%ld 对于 unsigned long long 不正确。可能 fprintf 正在获得分数的前 32 位并将其视为时间。我假设 ull 是 unsigned long long。
-
您在阅读
c时已经有未定义的行为,因为%ld不适合阅读`int。 -
您应该将此问题标记为 C++,因为它显然不是 C。
-
@thebusybee 抱歉,我以为我在 C 上,正在编辑它