如何省略字符串的点、逗号和空格(检查回文时需要)
Posted
技术标签:
【中文标题】如何省略字符串的点、逗号和空格(检查回文时需要)【英文标题】:How to omit the dots, commas and white spaces for a string (needed for checking a palindrome) 【发布时间】:2019-05-02 10:04:31 【问题描述】:我检查回文的程序(使用指针)必须计算几种情况。
输入可以是:
-
一个符号/字母(完成)
一个带有大写/小写字母的单词(完成)
一堆符号;如果只有符号,那么它总是回文(完成)
如果输入太大(>80),那么它不是回文(我需要使用 fgets,我设法完成了)
字母和符号的组合,如果是,那么就数字母(STRUGGLING WITH)
一个带有白色和逗号的句子 (STRUGGLING WITH)
-->为了获得输入,由于情况 4,我被提示只使用 fgets 函数。我仍然无法将输入字符串转换为所需的形式
e。 G。: 输入:女士,我是亚当 输出:回文 输入:?a.a! 输出:回文
我已经设法使用指针创建回文函数,将字符串中可能的字母转换为全小写,并在字符串仅包含符号时显示“回文”。
我怎么能设法改变 e。 g.:
char str[80] = "Madam, I'm Adam";
进入:
str[80] = "madamimadam";
?
【问题讨论】:
不允许使用isalpha? @P.W 对此不太确定,我们可以使用一些工具,但 e。 G。对于大写/小写,我必须创建一个原始函数(我已经完成了),但感谢您的提示,我至少会尝试一下 【参考方案1】:只需浏览整个字符串并以更方便的格式创建一个新字符串。在您进行大小写转换的同一位置:
#include <ctype.h>
void format (char* dst, const char* src)
size_t i=0;
while(*src != '\0')
char ch = tolower(*src);
if(isalpha(ch))
*dst = ch;
dst++;
src++;
如果isalpha
由于某些人为原因不可用,您可以轻松地自己创建它。这是一个快速、便携的查找表版本:
#include <stdbool.h>
bool my_isalpha (char ch)
static const bool ALLOWED[256] =
['A'] = true;
['B'] = true;
['C'] = true;
...
;
return ALLOWED[ch];
同一函数的原始版本只需检查if(ch >= 'A' && ch <= 'Z')
,假设仅大写。这对于学生作业来说可能没问题,但对于生产质量代码来说却不是。由于 C 标准不能保证字符在符号表中是相邻的。而且查找表版本的运行速度要快得多,因此没有理由不在专业程序中使用它。
【讨论】:
(“所以没有理由不在专业程序中使用它”当然,如果您正在编写一些 1980 年代的 crapitechture 8 位 MCU,并且闪存非常有限。)以上是关于如何省略字符串的点、逗号和空格(检查回文时需要)的主要内容,如果未能解决你的问题,请参考以下文章
GetAsyncKeyState(int vKey)中的点逗号减号