设计拼写检查程序

为啥写这个呢?是因为今天有被HR问道这个问题,但没有手撕,只是说下思路,我打算自己实现一下。

拼写检查程序

题目描述:

请设计一个自动拼写检查函数,对输入单词的错误依据字典进行修正。

  1. 输入为一个单词和一组字典单词,每个单词长度不超过9位;
  2. 若字典中没有与输入相同的单词,认为输入单词错误,需要从字典中选择一个修正单词;
  3. 修正要求:与输入单词长度相同,且单词中不同字符数最少;
  4. 存在多个修正单词时,取字典中的第一个;
  5. 输出修正后的单词。
分析:

对于拼写检查的代码,就是只检查你输入的对还是不对,但这个题是要预测用户到底想要输入啥,所以用了个预测的算法

	//先进行特殊处理
	输入为空指针的情况
	
	//处理
	if 输入的字符串长度==字典里的字符串长度
	{
		for 遍历比较输入的字符串与该字符串的不同字符个数count
			if count最小
				则此时的字符串就是用户要输出的字符串
	}
	else
	{
		输入有误,无法匹配
	}
代码:
//拼写检查程序,输出修正后的单词
#include<iostream>
#include<string>
#include<string.h>
using namespace std;

#define MAX_WORD_LEN 9

//比较输入的字符串长度与字典中的字符找出字符不同的个数
int diffCharCount(const char *s1,const char *s2)
{
	int count = 0;
	while(*s1 != '\0')
	{
		if(*s1 != *s2)
		{
			count++;
		}
		s1++;
		s2++;
	}
	return count;
}

//拼写检查
void FixWord(const char *pInputWord, long lWordLen, const char pWordsDic[][MAX_WORD_LEN], long lDicLen,
	char *pOutputWord)
{
	//特殊处理
	if(pInputWord == nullptr)
	{
		return;
	}
	int inputWordLen = strlen(pInputWord);//求输入单词的长度
	//处理
	//求每个单词的长度
	int *wordLen;
	wordLen = (int* )malloc(sizeof(int)*lDicLen);
	for(int x=0; x<lDicLen; x++)
	{
		wordLen[x] = strlen(pWordsDic[x]);
	}

	//比较输入单词与单词表中长度相同的单词

	int min = MAX_WORD_LEN;
	for(int j=0;j<lDicLen;j++)
	{
		//若长度相同再比较各个字符是否相同
		if(inputWordLen == wordLen[j])
		{
			//相同直接赋值
			if(strcmp(pInputWord, pWordsDic[j]))
			{
				strcpy(pOutputWord, pInputWord);
			}
			//否则返回相似度最大的单词
			else
			{
				int temp = diffCharCount(pInputWord, pWordsDic[j]);
				//找到这个字符不同数最少的单词就是要输出的单词
				if(temp < min)
				{
					min = temp;
					strcpy(pOutputWord, pWordsDic[j]);
				}
				
			}
			
		}
		//free(wordLen);
	}
}

//主函
int main()
{
	const char *pInputWord = "hello";
	const char pWordsDic[][MAX_WORD_LEN] = {"good", "hello", "world"};
	char pOutputWord[MAX_WORD_LEN];

	FixWord(pInputWord, 4, pWordsDic, 3, pOutputWord);
	
	cout<<pOutputWord<<endl;
	
	return 0;
}
笔记:

今天的笔记就是这个#include<string.h>头文件里边的内容,这是一个C标准库,这两天用C++用多了,把C的标准库快忘掉了。

#include<string.h>头文件里定义了各种操作字符串的函数,很实用。

  1. void *memchr(const void *str, int c, size_t n)
    在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
    返回为无符号型,因此可以将其进行强制转换成各种其他类型。
  2. int memcmp(const void *str1, const void *str2, size_t n)
    把 str1 和 str2 的前 n 个字节进行比较。比较的是ascci码值。
    返回值
    如果返回值 < 0,则表示 str1 小于 str2。
    如果返回值 > 0,则表示 str2 小于 str1。
    如果返回值 = 0,则表示 str1 等于 str2。
  3. void *memcpy(void *dest, const void *src, size_t n)
    从 src 复制 n 个字符到 字符数组dest中。
    返回也是这个指针dest。
    注意:复制完成后的字符串并不包括’\0’,需要自己加上。

这是一些练习的例子:

//string.h库的使用
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	char *str = "hello";
	char *str1 = "goad";
	char *str2 = "gobd";
	
	char x = 'e';

	//返回在str中的前strlen(str)个字符中,第一次搜索到字符x的位置
	char r1;
	r1 = (char)memchr(str, x, strlen(str));
	cout<<r1<<endl;

	//返回在str中的前strlen(str)个字符中,从字符x开始往后的字符串
	char *r2;
	r2 = (char*)memchr(str, x, strlen(str));
	cout<<r2<<endl;

	//返回两个字符串比较之后的大小值
	int r3 = memcmp(str1, str2, 3);
	cout<<r3<<endl;
	
	//从str22复制3个字符到字符数组str11中
	char str11[3];
	memcpy(str11, str2, 3);
	str11[3] = '\0';
	cout<<str11<<endl;


	return 0;
}

整几个常用的吧

  1. strcmp(const char *str1, const char *str2)
    把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
    int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节。
  2. char *strcpy(char *dest, const char *src)
    把 src 所指向的字符串复制到 dest。
    char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。

下来就是觉得会常用,但是还没用过的一些函数

  1. char *strchr(const char *str, int c)
    在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
    该函数返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。

  2. size_t strlen(const char *str)
    计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
    该函数返回字符串的长度。

  3. char *strrchr(const char *str, int c)
    在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
    该函数返回 str 中最后一次出现字符 c 的位置。如果未找到该值,则函数返回一个空指针。

  4. char *strstr(const char *haystack, const char *needle)
    在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。
    该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值