解决C语言中使用scanf连续输入两个字符类型的问题

昨天用C编程,遇到一个关于scanf的细节问题,假如运行如下程序:

#include<stdio.h>
int main()
{
 char ch1,ch2;
 printf("Input for ch1:/n");
 scanf("%c",&ch1);
 printf("ch1=%c/n",ch1);
 printf("Input for ch2:/n");
 scanf("%c",&ch2);
 printf("ch2=%c/n",ch2);
}

表面上看这段程序是没有错的,也可以运行,但运行过程中到第二个scanf输入值给ch2时,程序不会停止,而是直接运行到最后一个printf !

为什么?当时百思不得其解。。。

今天上网查了下才知道,原来scanf是从标准输入缓冲区中读取输入的数据,而%c的字符输入格式会接收回车字符,在输入第一个scanf时输入字符后按 回车结束,输入缓冲中保存了这个回车符,遇到第二个scanf时,它自动把这个回车符赋给了ch2。

而如果第二个scanf的输入格式不是%c时,由于格 式不匹配,这个回车符会被自动忽略,所以只有在连续输入两个%c的格式时才会出现这样的问题!

解决办法:(二办法任选其一)

1。清空输入缓冲区

第一个scanf后加入语句:

fflush(stdin); //C语言清空输入缓冲区函数

2。格式控制中加入空格

将第二个scanf改为:

scanf(" %c",&ch2);//在%号前面加一个空格

scanf格式输入时要求输入格式与格式控制符中的完全一样(如:scanf("abcd%c",&ch);输入时必须输入abcde,ch得到的值为e)空格可以抵消前面输入的回车符。

补充知识:利用C语言实现:输入两个字符串,统计一个字符串在另一个字符串中出现的次数。

输入两个字符串,统计一个字符串在另一个字符串中出现的次数

例如,asdfgasfgasf,as,则输出3

编程环境为codeblocks,编译器是GUN-GCC,操作系统是win7-64位

分析:此代码主要运用了一个算法,是字符串匹配的朴素模式匹配算法。看懂算法之后再来读代码就没有什么压力了。

代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
 char S[100],T[20];
 char ch1,ch2;
 printf("请输入主字符串:\n");
 ch1=getchar();
 int i=0;
 while(ch1!='\n')
 {
  S[i]=ch1;
  i++;
  ch1=getchar();
 }

 printf("请输入要筛选的字符串:\n");
 ch2=getchar();
 int j=0;
 while(ch2!='\n')
 {
  T[j]=ch2;
  j++;
  ch2=getchar();
 }

 int m,n;//m为S的下标,n为T的下标
 m=0;
 n=0;
 int num=0;//num用于记录选定单词出现的次数
 while(m<=i&&n<=j)
 {
  if(S[m]==T[n])
  {
   m++;
   n++;
  }
  else
  {
   m=m-n+1;
   n=0;
  }
  if(n==j)
  {
   num++;
  }
 }
 if(m==i+1)
  {
   printf("出现的次数是%d",num);
  }
}

以上这篇解决C语言中使用scanf连续输入两个字符类型的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言中sscanf()函数的字符串格式化用法

    介绍 sscanf()为C语言标准库函数,用于从指定字符串中读入与指定格式相符的数据.函数原型声明在stdio.h头文件中: int sscanf(const char *str, const char *format, ...); 该函数根据参数format(格式化字符串)来转换参数str指向的字符串,转换后的结果存于对应的可变参数内.其返回值为按照指定格式转换符成功读入且赋值的可变参数数目(若发生匹配错误而部分成功,该数目会小于指定的参数数目,甚至为0).若首次成功转换或错误匹配发生前输入已

  • c/c++ 利用sscanf进行数据拆分操作

    sscanf使用示例 示例:使用sscanf分割文件中的数据,数据源示例如下 川EZ1E58,贵GQ7708,:1302 贵AE0996,:185 贵A0PJ06,贵JYN192,贵JYN192,:128 分割代码如下所示: #include <stdio.h> #include <string.h> int DealLine(char *StrLine) { // find : data save char Parkid[20] = ""; char *p =

  • C++ 输入scanf()和输出printf()的操作

    在C语言中是用printf函数进行输出,用scanf函数进行输入的.C++保留了C语言的这一用法,在此只作很简单的介绍. scanf函数一般格式是: scanf(格式控制, 输出表列) printf函数的一般格式是 printf(格式控制,输出表列) [例3.4]用scanf和printf函数进行输入和输出. #include <iostream> using namespace std; int main( ) { int a; float b; char c; scanf("%d

  • c语言获取用户输入字符串是scanf和gets的区别详解

    解释 gets(s)函数与 scanf("%s",&s) 相似,但不完全相同,使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止. 1.scanf() 所在头文件:stdio.h 语法:scanf("格式控制字符串",变量地址列表); 接受字符串时:scanf("%s",

  • C语言清除scanf()缓存的案例讲解

    又重新过一遍C语言,感觉每次重学C语言都有不同的感受,遇到了一个问题,就是scanf()这个问题,其实细究起来,也有很多可以值得深挖的,实际上每次细细的挖掘的话,都是对C语言的更透彻的认识. 那么下面我就对scanf()中清除输入缓冲区的方法讲解: 应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种问题, 总的思想:通过各种方法将输入缓冲区的内容读

  • 解决C语言中使用scanf连续输入两个字符类型的问题

    昨天用C编程,遇到一个关于scanf的细节问题,假如运行如下程序: #include<stdio.h> int main() { char ch1,ch2; printf("Input for ch1:/n"); scanf("%c",&ch1); printf("ch1=%c/n",ch1); printf("Input for ch2:/n"); scanf("%c",&ch

  • C语言使用scanf连续输入字符串出现的问题

    #include<stdio.h> int main() { char a,b; scanf("%c",&a): scanf("%c",&b); printf("%c,%c",a,b); } 一段看上去很简单的代码,即使是C语言初学者也能看懂. 可是在运行的时候却出现了问题: ①输入a后按下回车 ②用空格隔开之后再按下回车 相信和我一样的大部分初学者,看着自己天衣无缝的代码,百思不得其解. 让我们先来看看,在百度百科中

  • C语言中关于scanf读取缓存区的问题

    目录 前言 scanf函数的定义 功能:执行格式化输入 总结 解决方法 前言 在牛客做了很多坑爹的题,明明代码没问题但是就退无法AC,看了很多题解之后,发现是scanf读取缓存区,在输入输出时出现了问题 于是写个博客总结一下 首先我们要了解什么是 scanf 函数 根据 cplusplus.com的解释 scanf函数的定义 scanf()函数是通用 终端格式化输入 函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并自动把数值变换成适当的机内格式. 其调用格式为: sc

  • 完美解决在oj中Python的循环输入问题

    完美解决在oj中Python的循环输入问题 这几天做题被python的循环输入问题给烦死了,好好查了一下,记录在此. while True: t= sys.stdin.readline().strip() if len(t)==0: #判断是否为空串 ,使用t==""也可以 break t= int(t) nums=[int(i) for i in sys.stdin.readline().strip().split(' ')] res = getDiff(t,nums) print

  • JS判断非空至少输入两个字符的简单实现方法

    dialog是我项目方法,你应该替换成alert(),或者你自己的 var str = $("#stuName").val(); if (str.length < 2) { dialog("提示", "text:请输入至少两位字符", 300, "auto", ""); return false; } str = str.replace(/(^\s*)|(\s*$)/g, '');//去除空格; if

  • C语言中的多行输入问题及说明

    目录 一.未明确具体输入行数 1.~scanf方式 2.EOF 3.根据输入元素的个数 二.已知具体输入行数 总结 牛客网和LeetCode的竞赛题中经常会遇到多行输入,以前不熟悉这种写程序的方式,初次接触时输入值会有很多问题. 多行输入有下面这些常用方法: 一.未明确具体输入行数 没有确定的输入行数时,一般要采用Ctrl+Z结束输入,系统会自动输入这些,我们要做的是设置好循环条件即可. 具体是每次输入都产生结果还是所有输入完以后再输出结果要看题目要求. 如:输入多个字符串,保存在二维数组中,可

  • C语言中输入函数(scanf()、fgets()和gets())的区别详解

    前言 大家都知道在C语言中,有三种主要的输入函数:scanf(),fgets()以及gets().他们的使用方法及注意事项如下: 1.scanf() 它是一种格式化的输入方式,可一次性按照规定的格式输入多个数据域. scanf函数是一个标准库函数,它的函数原型在头文件"stdio.h"中.与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件. scanf函数的一般形式为: scanf("格式控制字符串", 地址表列); 其中,格式控

  • C语言中关于scanf函数的一些问题详解

    在学习创建二叉树时遇到了scanf的一些问题,在此记录下来 创建根节点A后理想情况是输入A的左子树,若不为空继续创建左子树,但输入A后发现重复创建了一个左子树,测试后发现输入A换行后scanf函数接收了换行符(ASCII码10) 若想按次序创建各个节点则需要使用getchar()吸收换行符 不接收换行符也可以输入一个完整的二叉树序列,也可以成功创建. void CreateBiTree(BiTree &T) { char ch, temp; scanf("%c", &c

  • 解决C语言输入单个字符屏蔽回车符的问题

    C语言的scanf()函数在接收输入单个字符时会把上一次输入的回车符号当做这次输入的字符,造成无法正确的输入字符数据.这恐怕是初学C的童鞋门遇到的最头疼的问题了. 今天给大家提供四种解决方法供借鉴. 1.在scanf()中使用'\n'屏蔽回车符号. scanf("%d\n",&n); //使用'\n'过滤回车 scanf("%c",&c); 2.在scanf()格式串最前面添加空格,屏蔽回车字符 scanf("%d",&n

  • c语言中缺省参数的类型总结

    1.函数全缺省参数,函数在定义或者声明时,所有的形参都默认值. #include <stdio.h> //x,y为函数的形参,如果函数被调用时,没有设置x和y值,x值默认为100,y值默认为5 int sub(int x=100,int y=5) { return (x-y); } int main(void) { int a=20; int b=10; //变量a.b为sub函数的实参 printf("sub函数计算结果 = %d\n",sub(a, b)); //注意:

随机推荐