Linux C语言学习笔记5

第五章 字符串+printf函数详解+scanf函数详解

(1)字符串
1.C语言中没有字符串类型
2.在内存中以字符数组形式存储,每一个字符都占一个字节,结尾都有一个‘\0’字符结尾,其值为0,因此,即使一个字符串是空的也会占一个字节。
3.字符串在C语言当中的类型就是字符指针
char *p = “abc”;
任何一个字符串都是一个指向其首字符的指针
p = “abc” + 1;-----将b的地址赋给p,即指针p指向了b的地址
(2)printf输出函数
1.控制格式符:以%开头
%d----以十进制的形式输出整型整数
%10d----输出数据时,占10个字符的位宽,如果宽度不够则以空格填满,默认右对齐
%-10d----左对齐
%hd----以十进制的形式输出短整型整数
%ld----以十进制的形式输出长整型整数
%u----以十进制的形式输出无符号整型整数
%#o----以八进制的形式带八进制前缀‘0’输出整型整数
%#x----以十六进制的形式带十六进制前缀‘0x’输出整型整数
%c----以一个字符形式输出字符型数据()
char ch = ‘w’;//字符类型本身也是整型
即变量ch,可以看做存放了w这个字符,也可以看做存放了w对应的ASCII码值。但是要以整数输出w则控制格式符要以%hhd的形式。
%s----字符串形式
%.3s----输出前面的三个字符
char *s1 = “abc”;//字符串可以用一个字符指针s1来指向它
char s2[] = “ABC”;//也可以用一个字符数组s2来存放ABC
printf(“s1 = %s\n”,s1);
printf(“s2 = %s\n”,s2);
%f----浮点型数据单精度float
%lf----浮点型数据双精度double
%Lf----浮点型数据长双精度Long double
%.3f----输出小数点后三位有效数字(默认情况下会输出小数点后六位有效数字)
%e----以科学计数法来输出浮点型数据
(3)scanf输入函数
1.隶属于标准IO库函数
例子:

#include <stdio.h>
int main()
{
    int a, b;
    scanf("%d%d" , &a , &b);
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    return 0;
}

2.输入的数据如何通过scanf到达该进程的内存:
首先,内存的区域至少被分为两部分:
kernel(内核空间)、user(用户空间)
Step1 从键盘输入数据
Step2 内核中的键盘驱动程序读取输入的数据(包括回车)并存放在该驱动中
Step3 (由于scanf函数隶属于标准IO库函数,因此在用户空间中会分配一块标准IO缓冲区buffer)输入的数值将会被放到该缓冲区中
//以上步骤计算机自动完成
Step4 scanf相当于一个搬运工,即将输入的数据从缓冲区中放到所指定的内存(&a),而回车则作为一个结束的标记。当scanf正确的把一个数据搬到指定内存是,它会返回一个返回值1,两个数据则返回2,因此scanf的返回值代表它究竟把多少个数据成功地搬到指定内存。但是当输入了无效的数据时,scanf会立刻返回一个返回值0,并陷入死循环,无法重新读取新的数据(此时可通过把非法字符清空的方法重新启用scanf)。``
3.通过返回值判断scanf是否正确输入有效数据并清空buffer中的非法字符的方法:

#include <stdio.h>
int main()
{
	int a, b;
	while(1)
	{
		int ret = scanf("%d%d", &a, &b);
		if(ret == 2)
		{
			break;
		}
		printf("sorry! try again!\n");
		while(getcahr() != '\n')
		{
			;
		}
	}
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	return 0;
}
//getchar函数与scanf函数相似,都是要把标准IO的buffer的数据搬到指定的内存,并以回车结束。

两者的不同点:
getcahr()不挑剔,每次只拿一个字符,不管是什么字符,都拿到返回值里(例如:char c = getchar() != ‘\n’);返回值为c,则拿到的字符存放到c变量中 );
scanf()挑剔,只将有效的数据存放到指定内存;
///
高薪写法:

include <stdio.h>
int main()
{
int a, b;
while(1)
 
{
int ret = scanf("%d%d", &a, &b);
if(ret == 2)
break;
printf("sorry! try again!\n");
while(getchar() != '\n');
}
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}

///
完美版:
通过判断输入的的数据后面是否紧跟着一个回车来判断输入的数据后面是否有非法字符的方法

//有效地控制用户的输入
include <stdio.h>
int main()
{
    int a, b;
    while(1)
    {
	    int ret = scanf("%d%d", &a, &b);
	    if(ret == 2 && getcahr() == '\n')
	    break;
	    printf("sorry! try again!\n");
	    while(getchar() != '\n');
    }
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值