C语言_统计本件中各长度字符串出现的次数

本文记录了一次面试经历,机试题目要求统计txt文档中各长度字符串的个数。作者通过int数组实现,遇到fgetc读取为空、VS调试工具栏失效及读取UTF-8文件时长度多3等问题,最终解决问题并分享解决方案。

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

昨天去上海的渐华科技有限公司面试,到了之后只给做了一套笔试题和一道机试题。笔试题目内容很简单,常见的C语言的题目,还有一道手写编程:求字符串中最长的连续字符相同的字串的长度和位置。题目不难所以四十分钟就做完了,做完后就被喊去机试了,机试题目是:统计txt文档中各长度字符串的个数。做的过程中出现了很多问题。

我的思路是利用int 数组,统计下标长度的字符串出现的次数,然后输出。思路应该是没问题的。第一次编完后,试运行,发现fgetc(fp)出来的字符都是空,找了很久没找到原因,然后喊来了工程师,看了下告诉我,调试文件夹下的txt文档被改掉了,我说呢明明fopen成功了,读出来为什么不对,后来想想也确实是自己的问题,应该看下调试文件夹下的文档是不是有问题,不过谁能想的到,机试环境还要自己检查的!!!

然后第二个问题是编了一半,vs调试的工具栏失效了,怎么点都不动,快捷键也没用,,,试了一会儿无奈了,又喊来工程师,,,然后他把vs直接关了,重新打开就好了,,,,,代码还在。。。。看来这只是个简单的vs工程,并不是我以为的严格的机试环境,正常情况下,关了应该有都没了。。

算了,继续做,编完后发现程序陷入了死循环,读不到EOF结束符,,怎么都找不到原因,于是放弃了,一个小时的题目,做了一个半小时,,,心灰意冷啊简直。于是今天果断自己在电脑上试了下,找到了问题所在。

以下是程序代码:

#include "stdafx.h"
#include<iostream>

int main()
{
	FILE *fp;
	fp = fopen("zl2.txt","r");
	if(fp == NULL)
	{
		printf("error");
		exit(0);
	}
	int times[50];
	memset(times,0,sizeof(int)*50);
	char ch ;
	while((ch = fgetc(fp)) != EOF)
	{	
		int len = 0;
		while(ch != ' ' && ch != EOF) //应该是这里忘了判断是否为EOF,于是EOF情况下死循环了
		{
			++len;
			ch = fgetc(fp);
		}
		++times[len];
	}
	printf("Len\tTimes\n");
	for(int i = 0;i<50;++i)
	{
		if(times[i] != 0)
		{
			printf("%d \t %d \n",i,times[i]);
		}
	}

	fclose(fp);
	return 0;
}

想想当时这个小问题如果再冷静的看个一分钟肯定就发现了啊,但是之前出了那么两个幺蛾子事件,也没法冷静了。也怪自己平时文件编程不熟吧。


今天在测的时候出了另一个问题,就是txt文档读取时,首字符串,长度总是多了3,后来谷歌了下才发现,原来是

在windows平台下,使用系统的记事本以UTF-8编码格式存储了一个文本文件,但是由于Microsoft开发记事本的团队使用了一个非常怪异的行为来保存UTF-8编码的文件,它们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,所以我们就会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报出语法错误,等等。

于是试了下用NotePad++打开文本文档,然后在格式菜单里选择:以UTF-8的无BOM格式编码。保存,读取,ok!!!

以下是文本内容和运行结果,仅供参考:



如有任何问题,欢迎指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值