从字符串中删除常量

如何解决从字符串中删除常量

我编写了一个代码来从字符串中删除常量并返回元音。我的代码不适用于由空格分隔的单词数的字符串。这是我的代码:

    int T;// integer T denoting the number of test cases. For each test case,we input a string.
cin>>T;
string s;
char arr[10] = {'a','e','i','o','u','A','E','I','O','U'};
for(int n = 0; n < T; n++){
    cin>>s;
    for(int i = 0; i < s.size(); i++){
        for(int j = 0; j < 10; j++){ 
            if(s[i] == arr[j]){cout<<s[i];}
        }
        if(isspace(s[i])){cout<<"n";}
    }
    cout<<endl;
}

输入: wdTSFuI IvfHOSNv , 它的正确输出是: uI IO , 我的输出是:uI

解决方法

上述错误是因为在通过命令行输入时 C++ 省略了空格后的数据,因此它只读取空格前的数据,这就是为什么您只在前半部分出现元音的原因。

克服此错误的三种方法。

  1. 使用 getline 读取带有空格的字符串,新更改的代码是
#include <iostream>
#include <string>
using namespace std;

int main() {
    int T;// integer T denoting the number of test cases. For each test case,we input a string.
    cin>>T;
    string s;
    char arr[10] = {'a','e','i','o','u','A','E','I','O','U'};
    for(int n = 0; n < T; n++){
        getline(cin,s);     
        for(int i = 0; i < s.size(); i++){
            for(int j = 0; j < 10; j++){ 
                if(s[i] == arr[j]){
                    cout<<s[i];
                }
            }
            if(isspace(s[i])){cout<<"n";}
        }
        cout<<endl;
    }
}
  1. 使用字符数组来克服这个错误。

  2. 或者提供不带空格的输入。

我认为这可能会解决您的问题

,

当然解决方案是使用 std::getline 读取整行,包括空格。

我不明白您的行 if(isspace(s[i])){cout<<"n";},因为在您显示的输出示例中,您想显示空格而不是“n”。我想这是一个错字,应该是“”。

无论如何。使用 std::getline 你的函数看起来像

#include <iostream>
#include <string>

int main() {

    // We need to operate on a given number of test cases
    size_t numberOfTestCases{}; std::cin >> numberOfTestCases;

    // Handle all test cases
    while (numberOfTestCases--) {

        // Read a complete line with text
        std::string line{}; std::getline(std::cin,line);

        // In case of space or vowel,print that
        for (const char c : line)
            if ((c == 32) or ((0x208222 >> (c & 0x1f)) & 1)) std::cout << c;
        std::cout << '\n';
    }
    return 0;
}

因为我看到了一些带有“测试用例”的东西,我猜你在这些不神圣的“竞赛编程”网站上。

这就是为什么我使用条件 ((0x208222 >> (c & 0x1f)) & 1) 来检查一个字符是否是元音。这已经有几十年的历史了。并且适合此类网站。

如果有人对其工作原理感兴趣,请发表评论,我将编辑答案并进行解释。


编辑

根据要求,我将解释 for 循环。首先,我们有一个基于范围的 for 循环。和写一样:

for (int i=0; i < line.length(); ++i) {
    const char c = line[i];
    . . .
}

然后您可以看到,我们首先检查字符 c 是否等于 32。32 是空格的 ASCII 代码。你可以看到这个here


那么,现在,如何检查一个字符是否是元音。

如果我们使用ASCII码来编码字母,那么我们会看到如下:

Ascci Code for Letters

我们看到大写和小写字母的 ASCII 码只是低 5 位不同。

所以,如果我们用 0x1F 屏蔽 ASCII 码,那么 char c{'a'}; unsigned int x{c & 0x1F},我们将得到 1 到 26 之间的值。

所以,我们可以为每个字母计算一个 5 位的值。

如果我们现在用 1 标记所有元音,我们可以构建一个由 32 位(无符号整数)组成的二进制数,并在元音为真的每个位置设置一个位。然后我们得到类似

Bit position
3322 2222 2222 1111 1111 1100 0000 0000  
1098 7654 3210 9876 5432 1098 7654 3210  
Position with vowels:
0000 0000 0010 0000 1000 0010 0010 0010

这个数字可以转换为0x208222。

如果我们现在想知道,如果一个字母(无论是大写还是小写)是元音,那么我们从字符( C & 1F )中屏蔽掉不需要的位并将二进制数移到与生成的字母代码一样多的位置。如果该位设置在 LSB 位置,那么我们就有了一个元音。这已经有几十年的历史了。

例如:字符“e”。 ASCII 码为 101。用 1F 掩码将使其为 5。然后我们将数字 0x208222(等于 0000 0000 0010 0000 1000 0010 0010 0010)这 5 个位置向右移动,我们得到 0000 0000 0000 0001 0000 0100 0001 0001。并且设置了带有“e”标记的最低位。因此,它是一个元音。

啊哈。不是那么容易,但适用于 ASCII 编码的字母。

顺便说一句,它也适用于其他字符选择。

结果是:

auto isVowel = [](char c) { return (0x208222 >> (c & 0x1f)) & 1; };

酷。 . .

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res