C语言无I/O语句,I/O操作由函数实现。
1.putchar(c)字符输出函数
格式: putchar( c );
参数: c为字符常量、变量或表达式
功能:把字符c输出到显示器上
返值:正常,为显示的 c 代码值;
2.printf格式输出函数
格式:printf(“格式控制串”,输出表)
功能:按指定格式向显示器输出数据
输出表:要输出的数据
格式控制串:包含两种信息
格式说明:%[修饰符]格式字符,用于指定输出格式
普通字符:原样输出
2.1格式符
格式符 | 作用 |
i/d | 十进制整数 |
x/X | 十六进制无符号整数 |
o | 八进制无符号整数 |
u | 无符号十进制整数 |
c | 单一字符 |
s | 字符串 |
e/E | 指数形式浮点数 |
f | 小数形式浮点小数 |
g | e和f较短的一种 |
%% | 百分号本身 |
int a=567;printf ( “%d”,a); //567
int a=255;printf(“%x”,a); //ff
int a=65;printf(“%o”,a); //101
int a=567;printf(“%u”,a); //567
char a=65;printf(“%c”,a); //A
printf(“%s”,“ABC”); //ABC
float a=567.789;printf(“%e”,a); //5.677890e+02
float a=567.789;printf(“%f”,a); // 567.789000
float a=567.789;printf(“%g”,a); // 567.789
printf(“%%”); //%
int n = printf("HELLO world!");//printf的返回值是字符串的个数(会
加上\n),如果遇到错误的时候返回负数
printf("\n%d\n",n); //这里可以在前面加上\n,也能达到换行
n = 12
2.2特殊功能格式符
修饰符 | 功能 |
m | 输出数据所占空间,数据长度<m,左边补空格,大于则按实际要求输出 |
.n | 对实数,指定小数位数,对字符串,指定实际输出的位数 |
- | 数据左对齐输出(缺省就是右对齐输出) |
+ | 指定有符号数的正数前加+ |
0 | 输出数值时指定左边不使用空格,使用0填充 |
# | 在八进制和十六进制前显示前导0,0x |
l | 在d,o,x,u前,指定输出的精度为long型 |
l | 在e,f,g前,指定输出的精度为double型 |
例 static char a[]=“Hello,world!”
printf(“%s\n%15s\n%10.5s\n%2.5s\n%.3s\n”,a,a,a,a,a);
运行结果:Hello,world!
Hello,world!
Hello
Hello
Hel
2.3 %.*s 是 printf 格式化字符串的一种格式,它允许你指定一个字段宽度,并且该字段宽度是由一个整数参数指定的,而不是一个固定的数字。
具体来说:
- %.*s 中的 % 表示这是一个格式化字符串的开始。
- * 表示字段宽度是通过后面的参数指定的,而不是直接写在格式化字符串中。
- s 表示参数是一个字符串。
因此,%.*s 这个格式化字符串需要两个参数:
- 第一个参数是一个整数,用于指定字段宽度。
- 第二个参数是一个字符串,它是要打印的字符串。
例如,在下面的示例中,我们打印了一个长度为3的子字符串:
#include <stdio.h>
int main() {
char str[] = "Hello, World!";
printf("%.*s\n", 3, str); // 打印 "Hel"
return 0;
}
在这个示例中,%.*s 表示我们打印一个长度为3的子字符串,并且字符串是由参数 str 提供的。
#include <stdio.h>
#include <string.h>
int main() {
char arr[20] = "acdfg";
printf("%.*s\n", (int)(arr + 2 - arr), arr);
return 0;
}
这样输出的结果就是数组 arr 中第三个元素(下标为2)之前的部分 "ac"。
3.getchar()字符输入函数
字符输入函数getchar
格式: getchar( )
功能:从键盘读一字符
返值:正常,返回读取的代码值;出错或结束键盘输入,返回-1 (ctrl + d)
#include <stdio.h>
int main()
{ int c;
printf("Enter a character:");
c=getchar();
printf("%c--%d->hex%x\n", c, c, c);
}
运行结果:
Enter a character:A
A--65->hex41
char password[20] = {};
scanf("%s",password) //这里并没有取地址符号,因为数组名本身就是地址
4. scanf格式输入函数
格式: scanf(“格式控制串”,地址表)
功能:按指定格式从键盘读入数据,存入地址表指定
存储单元中,并按回车键结束
返值:正常,返回输入数据个数
地址表:变量的地址,常用取地址运算符&
注:当接收%S时候,如果加了空格,就会结束,如果要加空格,就要用gets()。
4.1格式符
格式符 | 作用 |
i/d | 十进制整数 |
x/X | 十六进制无符号整数 |
o | 八进制无符号整数 |
u | 无符号十进制整数 |
c | 单一字符 |
s | 字符串 |
e/E | 指数形式浮点数 |
f | 小数形式浮点小数 |
g | e和f较短的一种 |
%% | 百分号本身 |
h | 用于d,o,x前,指定输入为short型整型 |
l | 用于d,o,x前,指定输入为long型整型 用于e,f前,指定输入为double型数据 |
m | 指定输入数据宽度,遇到空格或不可转换的字符结束 |
* | 抑制符,指定输入项读入后不复制给变量 |
scanf(“%4d%2d%2d”,&yy,&mm,&dd);
若输入19991015
则yy为1999, mm为10, dd为15
scanf(“%2d %*3d %2d”,&a,&b);
若输入1234567
则a为12,b为67
用“%c”格式符时,空格和转义字符作为有效字符输入
scanf(“%c%c%c”,&c1,&c2,&c3);
若输入a bc
则c1为a, c2为空格, c3为b
总结,输入数据时,遇以下情况认为该数据结束:
遇空格、TAB、或回车
遇非法输入
遇宽度结束
5.输入函数留下的“垃圾”(多输入的空格回车)
使用输入函数可能会留下垃圾
int x;
char ch;
scanf(“%d”,&x);
scanf(“%c”,&ch);
printf(“x=%d,ch=%d\n”,x,ch);
这里当给x赋值的时候,回车成为垃圾符号。会被附值给ch
方法1:用getchar()清除
int x;
char ch;
scanf(“%d”,&x);
getchar();
ch=getchar();
printf(“x=%d, ch=%d\n”, x, ch);
方法2:用格式串中空格或“%*c”来“吃掉”
int x;
char ch;
scanf(“%d”,&x);
scanf(“ %c”,&ch);或 scanf(“%*c%c”,&ch);
6gets字符串输入函数
字符串输入函数gets
格式: char * gets(char *s)
功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加‘\0’
说明1:输入串长度应小于字符数组维数
说明2:与scanf函数不同,gets函数并不以空格作为字符串输入结束的标志。
int main( )
{ char string[15];
printf(“Input a string:”);
gets(string);
printf(“%s\n”, string);
return 0;
}
这里很容易警告
局部变量在栈上,如果输入的字符号,超过14,很容易栈溢出
7.puts字符串输出函数
字符串输出函数puts
格式:int puts(const char *s)
功能:向显示器输出字符串(输出完,换行)
说明:字符数组必须以‘\0’结束
#include <stdio.h>
int main( )
{ char string[80] = “How are you”;
puts(string);
return 0;
}
输入: How are you?
输出: How are you ?