读书人

一到C语言的题目,小弟不能解决,请三天

发布时间: 2012-03-08 13:30:13 作者: rapoo

一到C语言的题目,小弟不能解决,请各位大哥三天之内帮帮忙.
给定一个文件,该文件中存放了大量英文词组,文件的每一行存放一个词组,比如:
hello world
short message service
short message
you are a dog

词组中每个单词的首字母按单词的先后次序排列在一起我们定义为词组的缩写。比如hello world的缩写为hw,short message的缩写为sm。如果一个字符串和词组的缩写相同,或者和该词组缩写的起始部分相同,则称该词组与字符串匹配。比如you are a dog与y、ya、yaa、yaad都是匹配的。

用c语言实现一程序,用户输入一字符串,程序输出文件中所有与该字符串匹配的词组,词组须按字符串的大小由小到大排列显示。
输入:字符串
输出:词组列表

例:
输入:sm
输出:short message
short message service


[解决办法]
我写了一个程序,由于时间仓促,且经验有限,代码较多,但作的UT不多,可能有些分支没测到,欢迎指正:
/****************************************************************/
//从文件中查找出如题要求的字符串
/****************************************************************/
void SearchInFile(char *FileName, char *pSearch)
{
FILE* fin = 0;
char linebuf[MAX_LEN] = " ";
char *ShortSayLine;
char *PrintBuff[MAX_LEN];
int Cnt = 0;
int PCnt = 0;

for(Cnt = 0; Cnt < MAX_LEN; Cnt++)
{
PrintBuff[Cnt] = NULL;
}

fin = fopen(FileName, "r ");
if(NULL == fin)
{
printf( "Can 't open %s\n ", FileName);
return;
}

if(NULL == pSearch)
{
return;
}

Cnt = 0;
while(fgets(linebuf, MAXLINE, fin) != NULL)
{
//得到每一行的缩写
ShortSayLine = GetShortSay(linebuf);
//判断是否含有要求查找的字符串
//有,则存放在PrintBuff[Cnt]指针数组中
if(0 == strncmp(ShortSayLine, pSearch, strlen(pSearch)))
{
PrintBuff[Cnt] = (char*)malloc(strlen(linebuf) + 1);
strcpy(PrintBuff[Cnt], linebuf);
Cnt++;
}
}

//给指针数组中的各字符串排序
SortString(PrintBuff, Cnt);
for(PCnt = 0; PCnt < Cnt; PCnt++)
{
printf( "%s\n ", PrintBuff[PCnt]);
if(NULL != PrintBuff[PCnt])
{
free(PrintBuff[PCnt]);
PrintBuff[PCnt] = NULL;
}
}

ShortSayLine = NULL;
return;
}
/****************************************************************/
//找出一个字符串的所有首子母作为缩写
//如输入:"short message service"
//则返回:"sms"
/****************************************************************/
char *GetShortSay(char *Src)
{
int Cnt = 0;
char sep[] = " ";
char RtnBuff[MAX_LEN] = " ";
char Temp[MAX_LEN] = " ";
char *token;

if(NULL == Src)
{
return (NULL);
}

strcpy(Temp, Src);
token = strtok(Temp, sep);
while(NULL != token)
{
RtnBuff[Cnt++] = *token;
token = strtok(NULL, sep);
}

RtnBuff[Cnt + 1] = '\0 ';
Src = RtnBuff;

return (Src);
}
/****************************************************************/
//给一组字符串排序
//如输入:"short message service
//      short message
// short mabcdef"
//
//则返回:"short mabcdef
// short message
//      short message service"
/****************************************************************/
void SortString(char *Src[], int StrCnt)
{
int iCnt = 0;
int jCnt = 0;
int Rtn = 0;
char *Temp;

for(iCnt = 0; iCnt < StrCnt - 1; iCnt++)
{
for(jCnt = 0; jCnt < StrCnt - iCnt - 1; jCnt++)
{
if(strlen(Src[jCnt]) > strlen(Src[jCnt + 1]))
{
Temp = Src[jCnt];
Src[jCnt] = Src[jCnt + 1];


Src[jCnt + 1] = Temp;
}
else if(strlen(Src[jCnt]) == strlen(Src[jCnt + 1]))
{
Rtn = strcmp(Src[jCnt], Src[jCnt + 1]);
if(Rtn > 0)
{
Temp = Src[jCnt];
Src[jCnt] = Src[jCnt + 1];
Src[jCnt + 1] = Temp;
}
else if(Rtn == 0)
{
jCnt--;
}
}
}
}

return;
}

读书人网 >C语言

热点推荐