字符串由1个字符 - C关闭

时间:2013-02-19 19:15:21

标签: c string

我正在编写天气数据库的代码,但是当我打印出城市和气温时,我的第一行是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

只有巴尔的摩正确对齐。任何帮助表示赞赏。

1 个答案:

答案 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--;

从城市名称中删除前导空格和尾随空格。