目录

1. 与getchar搭配

2. 与scanf搭配

2.1 %d格式控制符

2.2 %c格式控制符


1. 与getchar搭配

题目

大小写转换

描述

实现字母的大小写转换。多组输入输出。

输入描述

多组输入,每一行输入大写字母。

输出描述

针对每组输入输出对应的小写字母。

示例

输入:A

           B
输出:a

           b

备注

多组输入过程中要注意“回车”也是字母,所以要“吸收”(getchar())掉该字母。

#include <stdio.h>

int main()
{
    int ch = 0;
    while ((ch = getchar()) != EOF)//或写成while (~(ch = getchar()))
    {
        printf("%c\n", (ch + 32));//小写字母ASCII码值比大写字母大32
        getchar();//吸收多余的\n
    }
    return 0;
}

getchar函数

头文件

stdio.h

原型

int getchar(void);

说明

从标准输入流中获取一个字符

返回值

读取成功,返回读取的字符的ASCII码值

读取失败,返回EOF

EOF——end of file,值为-1,表示读取结束

//-1:
//原码:10000000000000000000000000000001
//反码:11111111111111111111111111111110
//补码:11111111111111111111111111111111
//(~)按位取反:00000000000000000000000000000000

当读取到EOF时,~(ch = getchar())为0,不进入循环。所以,

while ((ch = getchar()) != EOF)
{}

等价于

while (~(ch = getchar()))
{}

当我们在键盘上敲A[Enter]时,标准输入流中就有了A\n,getchar读取A,ch保存了A的ASCII码值。如果我们不处理掉\n,然后在键盘上敲B[Enter],我们本意是想读取B,但是此时标准输入流中有\nB\n,getchar读取的是\n。所以我们要用getchar“吸收”掉多余的\n,保证下一次能读取正确的字符。

2. 与scanf搭配

2.1 %d格式控制符

题目

KiKi和酸奶

描述

BoBo买了一箱酸奶,里面有n盒未打开的酸奶,KiKi喜欢喝酸奶,第一时间发现了酸奶。KiKi每h分钟能喝光一盒酸奶,并且KiKi在喝光一盒酸奶之前不会喝另一个,那么经过m分钟后还有多少盒未打开的酸奶?

输入描述

多组输入,每组输入仅一行,包括n,h和m(均为整数)。输入数据保证m <= n * h。

输出描述

针对每组输入,输出也仅一行,剩下的未打开的酸奶盒数。

示例

输入:8 5 16

输出:4

#include <stdio.h>

int main()
{
    int n = 0;
    int h = 0;
    int m = 0;
    int left = 0;

    while (scanf("%d %d %d", &n, &h, &m) != EOF)
    //或写成while (~scanf("%d %d %d", &n, &h, &m))
    {
        if (m % h)
        {
            left = n - m / h - 1;
        }
        else
        {
            left = n - m / h;
        }
        printf("%d", left);
    }

    return 0;
}

scanf函数

头文件

stdio.h

原型

int scanf(const char* format, ...);

说明

从标准输入流中读取格式化的数据

返回值

读取成功,返回参数列表中成功填充的项目数

读取失败,返回EOF

当读取到EOF时,~scanf("%d %d %d", &n, &h, &m)为0,不进入循环。所以,

while (scanf("%d %d %d", &n, &h, &m) != EOF)
{}

等价于

while (~scanf("%d %d %d", &n, &h, &m))
{}

%d控制符的scanf语句会从标准输入流中查找数据,跳过空白符(空格、换行符、制表符),读取整型,所以不用处理\n。

2.2 %c格式控制符

题目

判断元音还是辅音

描述

KiKi开始学习英文字母,BoBo老师告诉他,有五个字母A(a), E(e), I(i), O(o),U(u)称为元音,其他所有字母称为辅音,请帮他编写程序判断输入的字母是元音(Vowel)还是辅音(Consonant)。

输入描述

多组输入,每行输入一个字母。

输出描述

针对每组输入,输出为一行,如果输入字母是元音(包括大小写),输出“Vowel”,如果输入字母是非元音,输出“Consonant”。

示例

输入:A

           b

输出:Vowel
           Consonant

#include <stdio.h>

int main()
{
	char ch = 0;
	char arr[] = "AEIOUaeiou";

	/*在%c前面加一个空格,scanf会跳过空白符,读取第一个非空白字符
    防止\n作为下一个scanf语句的内容输入*/
	while (scanf(" %c", &ch) != EOF)//或写成while (~scanf(" %c", &ch))
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			if (ch == arr[i])
			{
				printf("Vowel\n");
				break;
			}
		}
		if (i == 10)
			printf("Consonant\n");
	}
	return 0;
}

除了%c,其他转换说明都会自动跳过待输入值前面所有的空白。因此,scanf("%d%d",&n,&m)与scanf("%d %d", &n,&m)的行为相同。对于%c,在格式字符串中添加一个空格字符会有所不同。

scanf( "%c",&ch)从输入中的第1个字符开始读取,而scanf (" %c", &ch)则从第1个非空白字符开始读取。