我正在编写天气数据库的代码,但是当我打印出城市和气温时,我的第一行是1个字符,我无法弄清楚原因。我注意到的一件事是当我打印例如printf(“%20s”,city);只修改了第一个城市。
这是关于C-Programming的介绍,他们还没有学到很多关于字符串的知识,这就是为什么我逐字逐句阅读。
以下是我所指的代码片段;
while(TRUE) {
for(
i=0;
fscanf(input,"%c", &c)!=EOF && c!='#';
i++)
{ //i.e. city#..
city[i]=c;
}
if(c=='#') {
city[i] = '\0'; //Next line scans in the weather for the days of the week
fscanf(input, " (%f, %f), (%d, %d), (%d, %d), (%d, %d), (%d, %d), (%d, %d), (%d, %d), (%d, %d)",&h_avg, &l_avg,&s1,&s2,&m1,&m2,&t1,&t2,&w1,&w2,&th1,&th2,&f1,&f2,&sa1,&sa2);
printf("%20s %d %d", city, s1,s2);
} else {
printf("\n");
break;
} //Break infinite loop because for loop broke from EOF
}
示例输出:
Baltimore 75 60
Miami 20 10
Washington D.C. 75 50
New York 75 50
只有巴尔的摩正确对齐。任何帮助表示赞赏。
答案 0 :(得分:5)
"%c"
scanf模式不会跳过空格,因此您可能会在城市字符串中获得空格。特别是,由于您从未扫描过去一行末尾的换行符(\n
),因此您的城市名称都将以换行符开头(第一行除外)。此外,您的printf
从不打印任何新行(除了城市中的新行),以便解释您所看到的内容。
更确切地说 - 你的第二个城市被读为"\nMiami"
(6个字符),因此当用"%20s"
打印时,它首先打印14个空格。这些空格都打印在Baltimore
行的末尾(因为它的末尾没有打印换行符),然后打印"\nMiami"
尝试使用:
for (i = 0; fscanf(input,"%c", &c)!=EOF && c!='#';) {
if (i == 0 && isspace(c)) continue;
city[i++] = c; }
while (i>0 && isspace(city[i-1])) i--;
从城市名称中删除前导空格和尾随空格。