C和指针——读书笔记(一)

本科的时候学过C语言,知识基础真是薄弱。最近被指针折磨的痛不欲生,在实验室翻出一本《C和指针》,翻出来读,第一章就觉得受益匪浅,于是决定写一些读书笔记,记下自己疑惑的地方。

C语言中基本的输入输出函数有:

putchar ():把变量中的一个字符常量输出到显示器屏幕上;
getchar ();从键盘上输入一个字符常量,此常量就是该函数的值;
printf ();把键盘中的各类数据,加以格式控制输出到显示器屏幕上;
scanf ();从键盘上输入各类数据,并存放到程序变量中;
puts ():把数组变量中的一个字符串常量输出到显示器屏幕上;
gets ():从键盘上输入一个字符串常量并放到程序的数组中.
sscanf(); 从一个字符串中提取各类数据。

这篇文章主要谈puts函数、gets函数、putchar函数、getchar函数、scanf函数、printf函数。
首先这些函数都包含在stdio.h头文件里。

一.gets函数和puts函数

顾名思义,get string,获得一串字符串。

gets函数从标准输入读取一行字符串并把它存储于作为参数传递给它的数组。一行输入由一串字符组成,以一个换行符结尾。gets函数丢弃换行符,并在该行的末尾存储一个NUL字节。(一个NUL字节是指字节模式为全0的字节,类似‘\0’ 这样的字符常量).然后gets函数返回一个非NULL值,表示该行已经被成功读取。

puts函数是gets函数的输出版本,把指定的字符串写到标准输出并在末尾添上一个换行符。

    char input[10];
    printf("please input!\n");
    gets(input);
    puts(input);

1
同样在程序运行截图中可以看出,我在printf末尾加了一个换行符,才回换行,说明printf函数不会自动换行。(当年华为机试被这个坑惨了………)

二.getchar函数和putchar函数

顾名思义,get char ,获得一个字符

getchar函数从标准输入读取一个字符并且返回它的值。如果输入中不存在任何字符,则函数就会返回常量EOF(在stdio.h中定义),用于提示文件的结尾。

这个函数通常用来统计一段输入中某些字符的个数.《The_C_Programming_Language》这本书第一章就用到这个函数。此处,我写一个小小的程序,类似C程序设计语言中的程序,实现统计一点输入中“* & % $”的个数。

    int ch;
    int j,k,m,n;
    j = 0;k = 0; m = 0; n = 0; 
    printf("please input!\n");

    while (ch != EOF)
    {
        ch =getchar();
        switch (ch){
        case '*':
            j++;
            break;
        case '&':
            k++;
            break;
        case '%':
            m++;
            break;
        case '$':
            n++;
            break;
        default:
            break;

        }


    }
    printf("%d %d %d %d",j,k,m,n);

如果细心的朋友会发现我将ch声明为int型,用来读取字符。我在读《The C Programming_Language》时也不理解,在读《C和指针》时得到答案。EOF是一个整型值,它的位数比字符型要多,把ch声明为整型可以防止从输入读取的字符被意外的解释为EOF。但同时,这也意味着接收字符的ch必须足够大,足以容纳EOF,这就是ch使用整型值的原因。

putchar输出一个字符,此处不多讲。

三.scanf函数和printf函数

scanf函数和printf函数我们平时用的最多,也是最有用的。

格式化输入输出就不再多说,自行百度,说一下,字符串的输入。能进行字符,字符串输入的有:
getchar(), scanf(“%c”); scanf(“%s”), gets();
结合我上面说的,可以看出getchar(), scanf(“%c”),作用一样; scanf(“%s”)和 gets()作用一样。

getchar() 和 scanf(“%c”)
需要注意的是,这两个函数读入的是输入流中当前位置的字符,
比如:
scanf(“%d”,&n);
c = getchar();
假设输入 67/ (假设“/”代表回车),则第一个scanf读入一个整数67后,当前输入流的位置是67之后,即指向回车符,所以第二个getchar()读入的就是一个回车符了,即 c = ‘\n’。

同样,gets()也是从当前位置读入一行字符串。
比如:
scanf(“%d”,&n);
gets(str);
此时读入字符数组中的字符串就是“\n” 了
所以通常在用scanf读入一个非字符串的类型之后,如果要读入字符,或字符数组,都用一个额外的getchar()把回车符读掉,若后面跟的不止一个回车符,可能还有多余的空格的话,就用gets()读掉。

和以上不同的是,scanf(“%s”) 读入的时候是会忽略掉空格,回车和制表符的。并且以空格,回车和制表符作为字符串结束的标志。如果要读入一个带空格符的字符串时因该用gets(), 而不宜用scanf()!

sscanf函数比较复杂,需要单独分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值