欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

洛谷 | P4414题解及对scanf再学习

程序员文章站 2022-03-05 10:33:38
...

题目要求

洛谷 | P4414题解及对scanf再学习

题解与易错点

1、利用快排,排序,用for循环和if按照给定的顺序重新排序

2、对于scanf输入需深度理解与运用

核心代码

int main()
{
	int i,j;
	char ch;
	for(i=1;i<=3;i++)
	{
		scanf("%d",&a[i]);
	}
	quicksort(1,3);
	for(i=1;i<=3;i++)
	{
		scanf("%c",&ch);
		if(ch == 'A')
		{
			printf("%d ",a[1]);
		}
		else if(ch == 'B')
		{
			printf("%d ",a[2]);
		}
		 else if(ch == 'C')
		{
			printf("%d ",a[3]);
		}
	}
	getchar();
	return 0;
 } 

以上的代码存在两处错误,主要与scanf的输入有关。一是在输出是少一个数字,二是在判题时出现编译错误

(1)、scanf()每读取一个字符,跳过所有的的空白字符。scanf()不断地读取和保存字符,直至遇到非数字字符。遇到一个非数字字符,便认为读到了整数的末尾。然后scanf会把非数字字符放回输入,意味着在下一次读取输入时,首先读到的是上一次丢弃的非数字字符(编码问题所在,在输入A时后面有空格,被scanf输入吸收了,A,B被输入,C没有被输入)

(2)、在格式字符串中,除了%c,其他转换说明都会自动跳过待输入值前面的所有空白。如果把%c放在格式字符串中的空格前面,scanf()会跳过空格,从第一个非空白字符开始读取,scanf("%c,&ch)从输入的第一个字符开始读取,而scanf(" %c",&ch)则从第一个非空白字符开始读取。

以下为正确的核心代码

int main()
{
	int i,j;
	char ch;
	
	for(i=1;i<=3;i++)
	{
		scanf("%d",&a[i]);
	}
	quicksort(1,3);
	scanf("%c",&ch);//在外面再添加一个scanf输入便可解决第一个问题
	for(i=1;i<=3;i++)
	{
		scanf(" %c",&ch);//在%c前面添加空格
		if(ch == 'A')
		{
			printf("%d ",a[1]);
		}
		else if(ch == 'B')
		{
			printf("%d ",a[2]);
		}
		 else if(ch == 'C')
		{
			printf("%d ",a[3]);
		}
	}
	getchar();
	return 0;
 } 
相关标签: c语言