bool checkIfPangram(char* sentence)
{
int hash[27];
memset(hash,0,sizeof(hash));
int i=0;
int len=strlen(sentence);
for(i=0;i<len;i++)
{
hash[sentence[i]-96]++;
}
for(i=1;i<27;i++)
{
if(hash[i]==0)
{
return false;
}
}
return true;
}
这行代码hash[sentence[i]-96]++;,sentence[i]应该是个小写字母,为啥能直接-96呢。还是说它自动变成十进制的阿斯克码值再相减
判断句子是否全为小写字母
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- a5156520 2023-12-17 10:39关注
确实是用sentence[i]中的字符对应的ASCII码减去96,因为26个小写字母最开始的'a'的ASCII码值是97,然后相应小写字母的ASCII码值减去96得到一个1到26之间的整数,这个整数作为下标让hash数组相应元素值++,循环结束当相应元素值大于0,则对应的小写字母的个数肯定也是大于0的,如果等于0,则小写字母个数为0。
测试如下:
参考链接:memset()函数的用法详解-CSDN博客 文章浏览阅读10w+次,点赞189次,收藏354次。前言最近做题时突然想到用memset给数组的元素赋值100,但是发现结果和想象中的不一样通过debug看到数组中的元素的值都为1684300900,而明明给它的是100,这是为什么呢,于是查阅了一下memset函数的用法和原理memset()函数介绍首先来看函数原型void *memset(void *str, int c, size_t n)解释:复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。作用:是在一段内存块中填充某个给定的值,它是对较大的结构体或数_memset https://blog.csdn.net/Supreme7/article/details/115431235ASCII码对照表-完整ASCII码表-我就查查询 ASCII码表包含有ASCII打印字符对照表、ASCII控制字符对照表以及ASCII扩展字符对照表。 http://ascii.wjccx.com/C语言字符数组的初始化_字符数组初始化-CSDN博客 文章浏览阅读10w+次,点赞111次,收藏392次。1、字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空_字符数组初始化 https://blog.csdn.net/wangrunmin/article/details/7816705#include <stdio.h> #include <string.h> bool checkIfPangram(char* sentence) { int hash[27]; // https://blog.csdn.net/Supreme7/article/details/115431235 memset(hash,0,sizeof(hash)); // 将int数组中的元素值都赋值为0 int i=0; int len=strlen(sentence); // 计算字符串的长度 for(i=0;i<len;i++) // 遍历字符串每个字符元素的下标 { // http://ascii.wjccx.com/ // sentence[i]为字符串中的某个位置的字符,然后小写字母的ASCII码是从96开始 // 所以如果全是小写字母,则减去96后会得到一个1到26之间的整数 // 再使用这个整数作为下标让hash数组相应元素的值++ // 然后通过判断数组hash1到26之间的每个元素的值是否大于0,来判断小写字母的个数是否大于0 // 如果输入的字符不是小写字母,则会数组越界,所以必须保证传入的字符串全为小写字母 hash[sentence[i]-96]++; printf("sentence[%d]=%c,%d, hash[%d]=%d\n",i,sentence[i],sentence[i],sentence[i]-96,hash[sentence[i]-96]); } // 遍历hash数组的下标1到26 for(i=1;i<27;i++) { if(hash[i]==0) // 如果当前元素值为0,则表示相应小写字母的个数为0,返回false { return false; } } // 如果hash数组1到26每一个下标位置的值都大于0,则表sentence中的字符串包含所有小写字母,返回true return true; } int main(void){ // https://blog.csdn.net/wangrunmin/article/details/7816705 char str1[]="abcdefghijklmnopqrstuvwxyz"; if(checkIfPangram(str1)==true){ printf("true\n"); }else{ printf("false\n"); } char str2[]="abcdyz"; if(checkIfPangram(str2)==true){ printf("true\n"); }else{ printf("false\n"); } // 下面的代码会导致数组越界,因为传入的字符串包含非小写字母 // char str3[]="12abcdAB"; // if(checkIfPangram(str3)==true){ // printf("true\n"); // }else{ // printf("false\n"); // } // return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 Opencv(C++)异常
- ¥15 VScode上配置C语言环境
- ¥15 汇编语言没有主程序吗?
- ¥15 这个函数为什么会爆内存
- ¥15 无法装系统,grub成了顽固拦路虎
- ¥15 springboot aop 应用启动异常
- ¥15 matlab有关债券凸性久期的代码
- ¥15 lvgl v8.2定时器提前到来
- ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
- ¥15 cam_lidar_calibration报错