从屏幕读取字符串,并提取其中数字串,再次打印到屏幕或写入一个文件

本文通过分享作者在面试中遇到的问题,强调了实际操作对于掌握系统函数的重要性。作者通过使用C语言的系统函数(如gets、getchar)实现了从屏幕读取字符并提取数字的功能,并详细阐述了解决方案。该文章旨在提醒开发者在日常编程中不要过于依赖系统帮助,而应加强手写代码的实践,以加深对系统函数的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  毕业两年多,几乎天天游弋在代码的海洋中,每天都在跟茫茫的多媒体SDK和开源库打交道,这次去XXXX公司面试中却无法脱机写个简单字符串程序。思路流程虽然清楚(当时只是画了个流程图写了几个伪代码),但实现时发现自己平时很少用这些系统函数,编码时发现对系统函数入口参数,返回参数模棱两可。关键一点还是平时写代码太依赖一linux的系统man命令帮助查找,平时写代码几乎很少人为去记忆这些系统函数入口参数,返回值等。因为这系统函数都是标准的C库函数,linux桌面系统如ubuntu,基本上man一下就懂了,最惨的情况下去查一下C库。这次面试离开电脑,一张纸,一支笔就显得茫然。下文是回家后借助于linux的系统的MAN命令和GCC调试编码实现。以告诫和警示自己。

实现方法1:


/************************************************************
  文件摘要: 本文利用gets 实现从屏幕(标准输入stdin)读取字符,并将其中的数字
  字符打印出来或者存在到一个文件中
*/
#include<stdio.h>
#include <stdlib.h> 
/**************************************************************************
* 函数名称:ReadDigit
* 功能描述:从屏幕读取字符串,并提取数字,将数字保存起来或打印到屏幕
* 输入参数:无
* 输出参数:    无
* 返 回	值:失败:-1; 成功:0
?
* 修改日期	  版本号	 修改人		 修改内容
* -----------------------------------------------
* 2014/8/6		 V1.0			hfl	  XXXX
***************************************************************************/
int ReadDigit(void)
{  
    	int flag = 1;
	char buf1[1024];
	char buf2[1024];
	int i=0,j=0;
	FILE *fp;
	fp = fopen("chars2.txt","w");
	if (fp==NULL)
	{
	  printf("The file is creat failed\n");
	  return -1;
	}
	gets(buf1);
	while((buf1[i]!='\0')&&(i<1024))
	{ 
	  if((buf1[i]<='9')&&(buf1[i]>='0'))
	  {
		  buf2[j++]=buf1[i];
		  if(flag==1)
		  {
			  printf("screen=%d\n",atoi(&buf1[i]));
			  flag=0;
		  }
	  
	  }
	  else
	  {
	     flag=1;
	  }
	   i++;
	}
	printf("buf2=%d\n",atoi(buf2));
	buf1[j]='\0';
	#if 1
	if((fwrite(buf2,j,1,fp))!=1)
	{
	  printf("write is failed \n");
	  fclose(fp);
	  return -1;
	}
	fclose(fp);
	#endif
	return 0;
	
}
/**************************************************************************
* 函数名称:main
* 功能描述:一个进程的入口
* 输入参数:无
* 输出参数:    无
* 返 回	值:无
* 修改日期	  版本号	 修改人		 修改内容
* -----------------------------------------------
* 2014/8/6		 V1.0			hfl	  XXXX
***************************************************************************/
void main()
{
   int rc = -1;
   rc = ReadDigit();
  if(-1 == rc )
  printf("ReadDigit from screen is failed\n");
}


调试结果如下:

实现方法2:

/************************************************************
  文件摘要: 本文利用getchar 实现从屏幕(标准输入stdin)读取字符,并将其中的数字
  字符打印出来或者存在到一个文件中
*/
#include<stdio.h>
#include <stdlib.h> 

/**************************************************************************
* 函数名称:ReadDigit
* 功能描述:从屏幕读取字符串,并提取数字,将数字保存起来或打印到屏幕
* 输入参数:无
* 输出参数:    无
* 返 回	值:失败:-1; 成功:0
?
* 修改日期	  版本号	 修改人		 修改内容
* -----------------------------------------------
* 2014/8/6		 V1.0			hfl	  XXXX
***************************************************************************/
int ReadDigit(void)
{  
	int flag = 1;
	char buf[1024];
	int i=0;
	FILE *fp;
	fp = fopen("chars.txt","w");
	if(NULL == fp)
	{
           printf("The file is Open fail\n");
	   return -1;
	  
	}
      while(flag != EOF)
	{
	   flag = getchar();
	   if( flag == EOF )
	     {
	  	   break;
	     }
	  else
	     {
	  	  if(flag<='9'&&flag >='0')
	  	  {
			  #if 1
			  buf[i]=flag;
	  	  	  i++;
			  if(1024==i)
			  	 printf("The buf is full");
			  #endif
					  
	  	  	}
	      }
	 }
	printf("buf=%d\n",atoi(buf));
	buf[i]='\0';
	#if 1
	if((fwrite(buf,i,1,fp))!=1)
	{
	  printf("write is failed \n");
	  fclose(fp);
	  return -1;
	}
	fclose(fp);
	#endif
	return 0;
}
/**************************************************************************
* 函数名称:main
* 功能描述:一个进程的入口
* 输入参数:无
* 输出参数:    无
* 返 回	值:无
* 修改日期	  版本号	 修改人		 修改内容
* -----------------------------------------------
* 2014/8/6		 V1.0			hfl	  XXXX
***************************************************************************/
void main()
{
   int rc = -1;
   rc = ReadDigit();
  if(-1 == rc )
  printf("ReadDigit from screen is failed\n");
}


调试效果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江海细流

如该文章对你有帮助,请支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值