1.>SCANF
1.1-函数原型
int scanf( const char *format [,argument]... );
返回值
返回值
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
1.2-我们甚至可以加上一些限制性的
1.像这样的就只输出大写的(且是遇见第一个非大写字母的就停止了)
2.我们写的这些字符串 遇见了‘ ’的时候就会停止了;printf也不会输出了
(这时我们需要gets)
//scanf
#include<stdio.h>
int main(){
char arr[100];
scanf("%[A-Z]s",arr);
printf("%s",arr);
}
//gets原型 <stdio.h>
char *gets( char *buffer );
“输入控制符”和“输出控制符”要一模一样的。
这也就让我们很好的区分了从键盘上的上的是字符‘1’‘2’or数字789
(是%d就printf %d)(是%c就printf %c)
保证数据类型的对应
(举几个例子)
char -->%c
char arr[]-->%s
int ->%d
long int -->%ld
long long int-->%lld
int *p-->%p
float-->%f
double-->%lf
//有时候我们需要无符号形式
//如:
unsigned int-->%ud
格式控制符
说明
%c
读取一个单一的字符
%hd、%d、%ld
读取一个十进制整数,并分别赋值给 short、int、long 类型
%ho、%o、%lo
读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hx、%x、%lx
读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hu、%u、%lu
读取一个无符号整数,并分别赋值给 unsigned short、unsigned int、unsigned long 类型
%f、%lf
读取一个十进制形式的小数,并分别赋值给 float、double 类型
%e、%le
读取一个指数形式的小数,并分别赋值给 float、double 类型
%g、%lg
既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型
%s
读取一个字符串(如:以空白符为结束 ‘ ’or‘\n’)
插播一下EOF
#include <stdio.h>
int main(){
//EOF---END OF FILE 本质是-1
char ch;
while((ch=getchar())!=EOF){
putchar(ch);
}
}
参考的菜鸟教程里的
1.3-常见的书写方式:
(1)scanf("输入控制符", 输入参数); %d %c %s 等等
需要注意的是,出来字符串的输入,其他必须在 输入参数这里必须加上'"&"使得其获取该变量或者整形的数组的地址。
而像上方不加的原因是因为 在数组中数组名可以表示首元素的地址,那么我们就可以通过首元素将一串的地址获取到(因为我们开辟了就那么大遇见了‘\n’自然就结束,不闭担心)。
对此我们可以对比一下
1.》首地址写法:
#include<stdio.h>
int main(){
char ad[100];
scanf("%s",ad);//首地址形式的必须加
printf("%s",&ad[0]);
2》数组名写法:
#include<stdio.h>
int main(){
char ad[100];
scanf("%s",ad);//这里的话数组名对于去地址符号要求都可以的
printf("%s",ad);
}
(2)第二种写法(“a=%d”,&a)
这样的写(在谭浩强的那本书里就有这种写的题目 我们需要明白输入的格式是相当的严格的;
这种的必须 需要你的键盘上打出a=?(你的想要的数字)b=?(一样的道理)。
正所谓红花配绿叶 总不能吧将杂交起来吧(我说的是别 浮点型 、整形、字符混在一起)
(而且我们“ ”里的东西有啥就输入啥,我想说的是引号里的‘,’也需要打上)。
1.4-注意事项
参数的个数一定要一一对应
输入的数据类型一定要与所需要的数据类型一致
原样输入的,有几个就要输入几个,少一个字符或多一个',’都不行
是英文输入的“引号”,“&取地址”连“(括号)”也一样(毕竟是英文的)
写点注释 方便后续知道自己写的是什么
**
1. & 是地址运算符,分别获得变量的内存地址。
2、%d%d%d 是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab 键、回车键分隔。
如果使用 , 来分隔输入的 %d, 相应的输入时也需要添加 ‘,’(英文的逗号就英文,避免在中英文切换过程中产生错误)
1.5-实例
#include<stdio.h>
int main() {
int a,b,c;
printf("请输入三个数字:");
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
return 0;
}
//请输入三个数字:1 2 3
//1,2,3
2.>PRINTF
2.1-函数原型
int printf( const char *format [, argument]... );
返回值
如果成功,则返回写入的字符总数,否则返回一个负数。
#include<stdio.h>
int main(){
printf("%d",printf("%d",printf("%d",43))); //4321
}
#include<stdio.h>
int main(){
printf("%d",printf("%d",printf("%d",543)-1)); //54321
}
printf函数的返回值是打印的所有字符的总数(包括转义字符)。
2.2-输出形式
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数 %f格式字符只能输出6位小数。
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数(还有一点 X和x这大小写会影响十六进制的ABCDEF还是a,b,c,d,e,f)
%o 无符号以八进制表示的整数
%g %G把输出的值按照 %e 或者 %f 类型中输出长度较小的方式输出
%p 输出地址符
%lu 32位无符号整数
%llu 64位无符号整数
%a%A是以指数形式输出一个浮点数(十六进制)同样的:%a以小写显示abcdef,%A以大写字母显示ABCDEF
%%输出一个%
例子
1.0 可以将整形 类型转换 为浮点型
#include<stdio.h>
int main(){
int a = 1.0;
printf("%f\n",1.0*a/3);
return 0;
}
指定数据宽度和小数位数用%m.nf
输出的数据向左对齐,用%-m.nf。
(可以在谭浩强老师那这本书里找见)
2.3-注意事项
前导0 :%02d a=2; printf("%02d",a);
如果我们需要输出‘’或者‘\’ 那么我们就需要引入转义字符这个概念,因为‘’会找到第一个‘’与之联系
就像if....else 就找最近的
转义字符
解决办法 加上\ --》》\'' 就解决了
举例
#include<stdio.h>
int main()
{
int a=2;
printf("\'");//将会打印一个'(单引号)
printf("\"");//将会打印出"(双引号)
printf("\\");//将会打印出\(反斜杠)
printf("%d\ndef",a);
return 0;
}
2.4-例子
#include <stdio.h>
int main ()
{
int ch;
for( ch = 75 ; ch <= 100; ch++ ) {
printf("ASCII 值 = %d, 字符 = %c\n", ch , ch );
}
return(0);
}
3.>putchar&getchar
1-putchar
3.1.1-函数原型
int putchar( int c );
//把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中。
3.1.2-返回值
该函数以无符号 char 强制转换为 int 的形式返回写入的字符,如果发生错误则返回 EOF。
3.1.3-例子
#include <stdio.h>
int main(){
//EOF---END OF FILE 本质是-1
char ch;
while((ch=getchar())!=EOF){
putchar(ch);
}
}
#include <stdio.h>
int main ()
{
char ch;
for(ch = 'A' ; ch <= 'Z' ; ch++) {
putchar(ch);
}
return 0;
}
//ABCDEFGHIJKLMNOPQRSTUVWXYZ
2-getchar
3.2.1函数原型
int getchar(void)
3.2.2返回值
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF
3.2.3例子
#include <stdio.h>
int main ()
{
char c;
printf("请输入字符:");
c = getchar();
printf("输入的字符:");
putchar(c);
return(0);
}
3.2.4区别
getchar只能读取一个字符(从缓冲区域提取出一个字符)
scanf却可以读取各种类型的数据(字符、字符串、整形、浮点型、地址等等)
scanf不能读取空格和回车
4.gets&&puts
4.1gets
函数原型
char *gets(char *str)
返回值
如果成功,该函数返回 str。如果发生错误或者到达文件末尾时还未读取任何字符,则返回 NULL。
好处
gets可以读‘ ’空格 而scanf("%s")就比不了
#include<stdio.h>
int main()
{
char arr[100];
gets(arr);
printf("%s", arr);
return 0;
}
例子
#include <stdio.h>
int main()
{
char str[50];
printf("请输入一个字符串:");
gets(str);
printf("您输入的字符串是:%s", str);
return 0;
}
4.2puts
函数原型
int puts(const char *str)
返回值
如果成功,该函数返回一个非负值为字符串长度(包括末尾的 \0),如果发生错误则返回 EOF。
例子
#include <stdio.h>
#include <string.h>
int main()
{
char str1[15];
char str2[15];
strcpy(str1, "RUNOOB1");
strcpy(str2, "RUNOOB2");
puts(str1);
puts(str2);
return(0);
#include <stdio.h>
int main(){
char str[]="hello world";
puts(str+1);
return 0;
}