Pascal使用C风格输入输出
pascal吧
全部回复
仅看楼主
level 1
黄金止手 楼主
暂且只介绍Windows和Linux平台。
首先要使用系统自带的外部库。若编译平台是Windows,则C运行库名称为 'msvcrt' ,若平台为 Linux,则库名称为 'libc' 。
Windows和Linux的平台区别主要是Windows的换行字符串为
#13#
10("\r\n"),Linux的为#10("\n")。但不用在意这点,Windows下的输出函数在检测到输出文件为文本文件时,会自动补上 \r 。
还有一点就是微软的运行库比较旧,不支持 %zu 输出 size_t 。有些 OJ 的运行库停留在上个世纪,不支持 %lld (尽管支持 %I64d 但毕竟不是规范),建议不要使用。
使用 C 运行库时尽量不要用 Extended 类型,容易出现问题。有些运行库不支持 80bit 浮点数,另外就算是支持的库也可能存在压栈问题。
2016年08月21日 07点08分 1
level 1
黄金止手 楼主
对应类型
(左 C 右 Pascal)
signed char : ShortInt
unsigned char : Byte
short : SmallInt
unsigned short : Word
int : LongInt (32/64位)
unsigned int : LongWord (32/64位)
long : LongInt (32位)/ Int64 (64位)
unsigned long : LongWord (32位) / QWord (64位)
long long : Int64
unsigned long long : QWord
char : Char
char* : PChar
2016年08月21日 07点08分 2
level 1
黄金止手 楼主
float : Single
double : Double
void* : Pointer
size_t : SizeUInt
2016年08月21日 07点08分 3
level 1
黄金止手 楼主
注意 C 运行库函数都是采用 C 声明调用约定(cdecl,C 中写作 __cdecl)的。所以要用调用修饰。像 printf 这种可变参数函数还要用 varargs 声明。
另外声明外函数时,若未指定本名,则大小写是有别的,需要注意。
以下是 printf 的外部声明方法:
function printf(fmt:PChar):LongInt;varargs;cdecl;
external 'libc';
在Pascal调用时函数名可以不用在意大小写,但声明时必须完全符合全小写的 printf 。
2016年08月21日 07点08分 4
level 1
黄金止手 楼主
有时因为外部函数名称与Pascal关键词或函数重合,需要给它换个别名,方法是用 name 修饰符后加本名:
function AliasPrintf(fmt:PChar):LongInt;varargs;cdecl;
external 'libc' name 'printf';
另外,若 C 函数返回值为 void ,则应将其声明为过程。
2016年08月21日 07点08分 5
level 1
黄金止手 楼主
除了部分内部视作固定表达式的函数(如 abs, ln, ord 等)外,Pascal的函数也可以用过程的语法,舍弃返回值。
Pascal 的字符串字面常量能被自动转换成 PChar 指向的 C 风格字符串。但要注意转义字符的写法不同。
var
i:LongInt=10;
begin
printf('Hello World'
#10'%d'#
10, i);
end.
声明了 printf 后如上代码合法,且输出
Hello World
10
上面的格式字符串在 C 中的写法是 "Hello World\n%d\n" 。
2016年08月21日 07点08分 6
level 10
666
2016年08月22日 02点08分 8
level 3
不明觉厉[真棒]
2016年08月22日 04点08分 9
level 1
黄金止手 楼主
突然想起来 scanf 还没提。
其实差不多,注意Pascal的取址运算符是 @ 。
声明
function scanf(fmt:PChar):LongInt;varargs;cdecl;
external 'libc';
调用
var
c:Char;n:Int64;x:Single;y:Double;
begin
scanf('%c%lld%f%lf', @c, @n, @x, @y);
//...
end.
2016年08月22日 09点08分 10
level 1
黄金止手 楼主
由于不同平台下 stdin, stdout 定义不同,所以输入输出文件还是用 fscanf/fprintf 比较方便。
不同平台下 C 的 FILE 类型也有区别,不过不要紧,我们只需要指向它的指针。
可以这么声明:
type
CFilePtr=Pointer;
funtion fopen(fname, fmode:PChar):CFilePtr;cdecl;
external 'libc';
function fclose(fptr:CFilePtr):LongInt;cdecl;
external 'libc';
function fprintf(fin:CFilePtr;fmt:PChar):LongInt;varargs;cdecl;
external 'libc';
调用:
var
fout:CFilePtr;
begin
fout:=fopen('title.out', 'w');
fprintf(fout, 'FILE TEXT OUT'#10);
fclose(fout);
end.
2016年08月22日 09点08分 11
level 5
新人一只,看起来很有用[玫瑰]
但是有点儿问题(不要打我)
一个single变量(Pascal)赋值为2.3
一个double变量(Pascal)赋值为2.3
那请问如果我想输出它应该是
2.3000000000E+0000这样的吧
应用这种方法可不可以将它变成2.300000这样输出呢?
如果可以又该怎么写呢?(小白 ,基本啥都不懂[乖]
2016年08月23日 12点08分 12
用 x:0:6 这种格式。后面第一个数是最小输出宽度,第二个数是小数点后位数。
2016年08月23日 13点08分
@黄金止手 前一个数不是必须比后一个数大2吗?而且用这种方法的话比如输入是2.3,输出这个数据的时候就变成了2.29999995
2016年08月24日 01点08分
@leigh2000 没有限制,两个数都是非负数就行。
2016年08月24日 03点08分
@黄金止手 哦,这样。但是那个2.3变成2.299999995这样的怎么解决呢?
2016年08月24日 03点08分
level 1
没有你说的单元,楼主@黄金止手
2016年09月17日 08点09分 13
这不是单元。
2016年09月17日 23点09分
1