第8章 字符输入/输出和输入验证

8.1  单字符i/o:getchar()和putchar()

8.2  缓冲区

无缓冲输入:用户输入字符后,立即打印

缓冲输入:用户输入的字符被收集并储存在一个被称为缓冲区的临时存储区,按下Enter后,程序才可以使用用户输入的字符。

缓冲分为:完全缓冲I/O和行缓冲I/O。

完全缓冲I/O:缓冲区被填满时才刷新缓冲区。

行缓冲I/O:出现换行符时刷新缓冲区。

8.3  结束键盘输入

8.3.1  文件、流、键盘输入

文件:存储器中储存信息的区域。

流:实际输入/输出映射的一个理想化数据流。

8.3.2  文件结尾

1:以ctrl+z字符来标记文件结尾。

2:储存文件大小的信息。

c语言中getchar()读取到文件检测到文件结尾时将返回一个特殊的值即EOF(end of file)scanf()函数检测到结尾也返回EOF。

通常EOF定义在stdio.h文件中:

#define EOF (-1)

使用键盘输入EOF:要使用Ctrl+Z或Ctrl+D

8.4  重定向和文件

8.4.1  unix、linux、dos重定向

1.重定向输入

例:echo_eof<word    echo_eof是一个可执行文件,word是一个文本文件。该目的是用文件替换键盘输入。

2.重定向输入

例:echo_eof>word    该目的是键盘读取的数据输出到word文件中。

3.组合重定向

echo_eof<myword>saveword  等同与echo_eof>saveword<myword.

遵守原则:

重定向运算符连接一个可执行文件和一个数据文件

不能读取多个文件的输入/输出

通常文件名和运算符之间的空格不是必须的。

8.5  创建更友好的用户界面

5.5.1  使用缓冲输入

例:当输入非‘y’的字符时,程序会打印一次“111111111”,但实际上打印了两次,程序读取输入字符后判断,然后还将换行符读取进行了一次判断。

while(getcha()!='y')
{
printf("1111111111")
/*改变方法
while(getchar()!=' ')
continue;
*/ }

 8.5.2  混合数值和字符输入

当同时使用scanf和getchar时,scanf读取数字会跳过空格。

8.10  复习题

3.

#include<stdio.h>
int main()
{   
    int ch;
    int i=0;
    while (getchar()!='
')
    {
        i++;
    }
    putchar(i);
    return 0;
}

 8.11  编程练习

2.

#include<stdio.h>
int main()
{   
    int ch, i=0;
    for ( i = 1; (ch=getchar())!=EOF; i++)
    {
        if (ch>=' '|| ch=='
'||ch=='	')//32空格是一个界限,小于32的都是控制字符。
        {
            printf("%-5c",ch);
        }
        else
        {
            printf("^%-4c",ch+64);
        }
        printf("%-5d",ch);
        if (i%10 == 0)
        {
            printf("
");   
        }   
    }
    
    return 0;
}

3.

#include<stdio.h>
#include<ctype.h>
int main(void)
{
    int ch,i=0,j=0;
    while ((ch=getchar())!=EOF)
    {
        if (islower(ch))
        {
            i++;
        }
        else if (isupper(ch))
        {
            j++;
        }
        if (ch=='
')
        {
            printf("大写%d,小写%d",j,i);
        }  
    }
    
    return 0;
}

4.

#include<stdio.h>
#include<ctype.h>
float word_quantity(void);//字符流输入,计算平均单词字母数
int main (void)
{
    word_quantity();
    return 0;
}

float word_quantity(void)
{
    int ch,i=0;
    float j=0.0,k=0.0;//i为标志位
    while ((ch=getchar())!= EOF)
    {
        if( isalpha(ch) )
        {
            i=1;
            j++;
        }
        else if ( ispunct(ch) || (ch==' ') || (ch==' ')) 
        {
            if (i==1)
            {
                k++;
                i=0;
            }
            else
            {
                i=0;
            }           
        }
        if (ch==' ')
        {
            if (k==0)
            {
                printf("请重新输入");
            }
            else 
            {
            printf("平均单词数位%.2f ",j/k);
            j=0;
            k=0;               
            }                      
        }  
    }    
    return 0;  
}

5.理解二分法,当选择大于时要修该max,选择小于要修改min。

#include<stdio.h>
#include<ctype.h>
#include<stdbool.h>
int main (void)
{
    float num=50;
    bool bingo =false;
    int i=0;
    float max=100,min=0;
    while (!bingo)
    {
        printf("number is %.2f
",num);
        printf("1.大了,2.小了,3.猜对了
");
        if ((scanf("%d",&i)==1)&&(i>=1&&i<=3))
        {
            switch (i)
            {
            case 1:
                max=(min+max)/2;
                num=(min+max)/2;
                break;
            case 2:
                min=(min+max)/2;
                num=(min+max)/2;
                break;            
            case 3:
                max=(min+max)/2;
                num=(min+max)/2;
                break;            
            }
        }
        else
        {
            printf("请输入正确格式
");
        }   
    }
    
    return 0;
}

 6.

#include<stdio.h>
#include<ctype.h>
#include<stdbool.h>
int main (void)
{
    int ch;
    bool bingo=false;
    while (!bingo)
    {   
        ch=getchar();
        if(!isblank(ch))
        {
            bingo=true;  
            printf("第一个非空字符为%c",ch);
        }          
    }
    while (getchar()!='
')
    continue;  
    getchar();    
    return 0;
}

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/suwencjp/p/12350253.html