昨天去上海的渐华科技有限公司面试,到了之后只给做了一套笔试题和一道机试题。笔试题目内容很简单,常见的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!!!
以下是文本内容和运行结果,仅供参考:
如有任何问题,欢迎指正。