输入一个不超过17个字母的英文单词 w,然后编写一个程序,从un.txt 中读取英文句子,计算并输出句子中 w 的出现次数。w可以包含符号,如“apple!”。将 un.txt 中半角空格分隔的字符串视为一个单词,区分大小写,并区分是否有符号。
例如,当“apple”一词被指定时,“Apple”或“apple”!“不计数”。另外,不计数部分出现在英语单词中的字符串。例如,包含在“gather”中的“the”不计数。
只会读取和输出
求问中间部分应该怎么写,能有步骤解释就最好了,谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int coutX(char * juzi,char * w,int wl){ // 统计一个句子中的单词w数量
int i = 0, count = 0;
int flag = 0; // 标记是否已经开始记录下标
int start = 0; // 记录开始截取下标
int end=0; // 记录结束截取下标
int cmpOK=0; // 比较单词完全相同标记
int len = (int)strlen(juzi);
int t=0;// 记录截取的实际长度
int j = 0;
for (i=0;i<len;i++){ //
char c=juzi[i];
if ( c==' ' || c=='\r'|| c== 0x0A|| c=='\n' || c==0x0D || i==len-1){ // 因为题中明确了只有空格为单词分隔,所以只有空格需要跳过,或者句末
if(flag ){
end = i ;
if (i==len -1 ) end =len ; // 对行末的特殊处理
if ( wl == end-start ) { // 待测试的单词长度是匹配的,再进行深入处理
cmpOK=1;
for(j=0;j<wl;j++){
if (w[j] !=juzi[start+j]){
cmpOK=0;
break;
}
}
if (cmpOK) count++; // 深入比较后完全相同,则计数加1
}
}
start =0;
end =0;
flag = 0; // 标记还没有开始一个单词
}else if (!flag ) {
start =i ;
flag=1;
}
}
return count;
}
int main(int argc, const char* argv[]){
char w[18] ; // 用来接收输入的单词
int wl=0; // 用来记录w中的长度
FILE * fptr;// un.txt 文件操作句柄
char juzi[1024] = {0}; // un.txt获取句子
int count = 0;
printf("请输入一个待查的单词:");
scanf("%s",&w);
wl=strlen(w);
if ((fptr = fopen("un.txt", "r")) == NULL){
printf("Error! 打开文件出错!");
// 文件指针返回 NULL 则退出
exit(1);
}
while (fgets(juzi, sizeof(juzi), fptr) != NULL)
{
count=count+ coutX(juzi,w,wl);
}
fclose(fptr);
printf("共找到 %d 个\n", count);
}
不过上面的程序在处理多行的换行时,好像有一点问题,在windows下不能正确处理。
读取un.txt
文件,每次读取一行。遍历该行字符串,读到空格,则算作一个单词;将该单词与输入的单词比较,应该有函数可以用。
实现思路:
1、从un.txt获取句子
2、输入单词w
3、遍历句子进行比较
简单实现参考如下:
int main(int argc, const char* argv[])
char w[17] = "apple!"; // 输入的单词
char juzi[1000] = "This is a apple apple"; // un.txt获取句子
int i = 0, count = 0;
int flag = 0; // 标记是否已经开始记录下标
int start = 0; // 记录开始截取下标
int size = 0; // 要截取的长度
int len = (int)strlen(juzi);
// 对输入的单词进行去符号处理;
char nw[17];
int j = 0;
while (w[i] != '\0') {
char c = w[i];
if (c != ',' && c != ';' && c != '.' && c != '?' && c != '!' && c != ' ') {
nw[j] = c;
j++;
}
i++;
}
// 遍历句子截取单词进行比较
for (i = 0; i <= len; i++) {
char c = juzi[i];
if (c == ',' || c == ';' || c == '.' || c == '?' || c == '!' || c == ' ' || c == '\0') {
char *dst = (char *)malloc(size*sizeof(char));
memcpy(dst, juzi + start, size);
*(dst + size + 1) = '\0';
printf("%s %s\n", dst, nw);
size = 0;
flag = 0;
// 使用处理过的单词进行比较
if (strcmp(dst, nw) == 0) {
count++;
}
} else {
if (flag == 0) {
start = i;
}
flag = 1;
size++;
}
}
printf("共找到 %d 个\n", count);
return 0;
}