目录
1. 与getchar搭配
题目
大小写转换
描述
实现字母的大小写转换。多组输入输出。
输入描述
多组输入,每一行输入大写字母。
输出描述
针对每组输入输出对应的小写字母。
示例
输入:A
B
输出:ab
备注
多组输入过程中要注意“回车”也是字母,所以要“吸收”(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:
#include <stdio.h>
int getchar(void);
// 从标准输入流(stdin)中获取一个字符
// 成功时返回字符的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',但是此时标准输入流中有'\n''B''\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:
#include <stdio.h>
int scanf(const char* format, ...);
// 从标准输入流(stdin)中读取格式化的数据
// 成功时返回参数列表中成功填充的项目数,失败时返回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))
{
for (int 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个非空白字符开始读取。