标题:关于c的printf错位问题。。。
只看楼主
cwlmyjm
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2014-11-2
结帖率:50%
已结贴  问题点数:10 回复次数:9 
关于c的printf错位问题。。。
coursework2的作业要求写一个程序从一个stops.txt里面读取自行车站点的信息,在命令行输入起点和终点的经度纬度,计算出离起点最近的stops和终点的stops,最后再print出来。
正确的print应该像是这个样子的:
程序代码:
F:\Introduction to Programming\bikehelper>bikehelper 121.593567 29.86417 121.589
78 29.88098

Starting from 121.593567 29.864170

Walk North-West to haoyangguangshangwu at 121.593560 29.864180

Cycle North to tiyuguanbei at 121.589600 29.879370

Walk North to your destination at 121.589780 29.880980.


F:\Introduction to Programming\bikehelper>

我这一部分的代码是酱紫的:
程序代码:
...
    printf("Starting from %lf %lf\nWalk ",location[1],location[2]);
    direction(location[1],location[2],stops_info[stop_s].stop_longitude,stops_info[stop_s].stop_latitude);
    printf(" to %s at %lf %lf\nCycle ",stops_info[stop_s].stop_name,stops_info[stop_s].stop_longitude,stops_info[stop_s].stop_latitude);
    direction(stops_info[stop_s].stop_longitude,stops_info[stop_s].stop_latitude,stops_info[stop_d].stop_longitude,stops_info[stop_d].stop_latitude);
    printf(" to %s at %lf %lf\nWalk ",stops_info[stop_d].stop_name,stops_info[stop_d].stop_longitude,stops_info[stop_d].stop_latitude);
    direction(stops_info[stop_d].stop_longitude,stops_info[stop_d].stop_latitude,location[3],location[4]);
    printf(" to your destination at %lf %lf.\n",location[3],location[4]);
    exit(0);
}
我在我自己的WinXP下的dev下测试是完全正常的,但是在Ubuntu下测试就会问题。
于是到学校的centos下测试,学校的centos属于虚拟主机那种,在user目录下printf是完全正常,但是如果是在user/test文件夹下测试就又会出现问题。
问题就如图片中显示的一样。。。。但是如果将编译结果拷贝出来运行,又不会出现这样子的错位问题。。。
<img src="http://bucket. />
一开始考虑是不是没有加'\0'的原因,但是加上之后问题依旧存在。
源码:[local]2[/local]

搜索更多相关主题的帖子: 自行车 起点 信息 
2014-12-09 13:40
cwlmyjm
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2014-11-2
得分:0 

附上图片...
2014-12-09 13:43
cwlmyjm
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2014-11-2
得分:0 

附上源码...
bikehelper.rar (10.91 KB)
2014-12-09 13:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:5 
“这样子的错位问题” --- 完全没听懂,哪里有错位,你最好说清楚点
2014-12-09 14:12
cwlmyjm
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2014-11-2
得分:0 
回复 4楼 rjsp
正确的第二行应该是Walk North-West to haoyangguangshangwu at 121.593560 29.864180
但是从图片里面看出来,程序先是print了Walk North-West to haoyangguangshangwu然后又从这行的开始print接下来的 at 121.593560 29.864180。因为后半段的长度比前半部分短,所以在 at 121.593560 29.864180后还有地名的文字。。。就是不能理解为什么后半部分的print不是接着print而是重新到该行的开始print。。。。
2014-12-09 14:22
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
应该输出
Walk East to yangguangjiayuan at 121.496416 29.888567
Cycle Null to yangguangjiayuan at 121.496416 29.888567
实际输出
 at 121.496416 29.888567ayuan
 at 121.496416 29.888567iayuan
对吧?

我瞎猜猜,"yangguangjiayuan"后面可能接了个不可见字符'\r',遇到回车字符('\r')后,就从头开始打印,而不是从第二行开始打印,因为不是换行符'\n'。
为什么会多个回车符呢?因为windows下文本以"\r\n"断行,而linux下文本以"\n"断行。所以windows下的文本用linux上的fopen( , "t" )打开,每行尾部就会多个'\r'。

2014-12-09 15:10
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
得分:5 
造成这个问题的原因和代码没有关系,在UNIX下文本的每行文字以一个换行符结束,而WINDOWS下是以回车加换行结束。回车的作用是将光标置于当前行的行首,而换行的作用是将光标置于当前位置的下一行上。从你的输出来看printf(" to %s at %lf %lf\nCycle "……),这里的“%s”里的字符串结尾应该就只有一个回车符而没有换行符。

[qq]949654600[/qq]
2014-12-09 15:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
7楼解释是对的。不同平台有不同的行为,“可移植”代码必须针对平台自行处理。不要误解“可移植性强”这种说法的真实含义。

授人以渔,不授人以鱼。
2014-12-10 12:56
cwlmyjm
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2014-11-2
得分:0 
回复 6楼 rjsp
好像是的,我在用fgetc读取的时候最后一位没有加上'\0',导致这个字符串没有结尾符号。加上之后就正常了。
2014-12-10 22:54
cwlmyjm
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2014-11-2
得分:0 
回复 7楼 yahwei
在那个string结尾加上'\0',printf就正常了。
2014-12-10 22:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-439750-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.144527 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved