【C语言】while循环实现多组输入输出

目录

1. 与getchar搭配

2. 与scanf搭配

2.1 %d格式控制符

2.2 %c格式控制符


1. 与getchar搭配

题目

大小写转换

描述

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

输入描述

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

输出描述

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

示例

输入:A

           B
输出:a

           b

备注

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

#include 

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 
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 

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 
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 

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个非空白字符开始读取。

你可能感兴趣的:(C语言,c语言)