gpt4 book ai didi

c++ - 为什么 string::find 的行为不同?

转载 作者:行者123 更新时间:2023-11-28 04:14:35 25 4
gpt4 key购买 nike

bool check_tape(char* tape) {
int test8;
cout << example <<" "<<example.size()<<" "<<alpha_sym<<" "<< endl;
cin >> test8; //To pause the program, temporary
int err = 0;
for (int i = 0; i < example.size(); i++) {
if (alpha_sym.find(example[i]) >= 0 && alpha_sym.find(example[i]) < example.size()) {
cout << alpha_sym.find(example[i]) << " " << endl;
err += 0;
}
else {
cout << example[i]<<" "<< i << " не содержится в алфавите" << endl;
err++;
}
}
if (err) {
return 1; //Temporary I made here return 1, else program will crash
//get_acmd();
}
else return 1;
}

在一种情况下,find 会按预期返回第一个条目的位置,但在另一种情况下,它会返回 char 本身。
111+11 - 字符串,它的字符在另一个字符串“1+_”中搜索

同1435+212和01234567+_

Good case

Strange case

最佳答案

正如在对问题的评论中已经指出的那样,if 语句中有一个拼写错误

if (alpha_sym.find(example[i]) >= 0 && alpha_sym.find(example[i]) < example.size())
^^^^^^^^^^^^^^

代替 example.size() 必须至少有 alpha_sym.size()

但无论如何条件太复杂,find 方法一般被调用 3 次。

这段代码

for (int i = 0; i < example.size(); i++) {
if (alpha_sym.find(example[i]) >= 0 && alpha_sym.find(example[i]) < example.size()) {
cout << alpha_sym.find(example[i]) << " " << endl;
err += 0;
}
else {
cout << example[i]<<" "<< i << " не содержится в алфавите" << endl;
err++;
}
}

可以改写成下面的方式

for ( std::string::size_type i = 0; i < example.size(); i++ )
{
auto n = alpha_sym.find( example[i] );

if ( n != std::string::npos )
{
std::cout << n << " " << std::endl;
}
else
{
std::cout << example[i] << " " << i << " не содержится в алфавите" << std::endl;
++err;
}
}

如果你的编译器支持C++ 17那么你甚至可以这样写

for ( std::string::size_type i = 0; i < example.size(); i++ )
{
if ( auto n = alpha_sym.find( example[i] ); n != std::string::npos )
{
std::cout << n << " " << std::endl;
}
else
{
std::cout << example[i] << " " << i << " не содержится в алфавите" << std::endl;
++err;
}
}

注意(我认为简化的)函数的未使用参数 tape 可能应该声明为

bool check_tape( const char *tape )

前提是在函数中不改。在这种情况下,您将能够将字符串文字作为函数参数传递。

这是一个演示程序

#include <iostream>
#include <string>

int main()
{
std::string example( "1435+212" );
std::string alpha_sym( "01234567+_" );
unsigned int err = 0;

for ( std::string::size_type i = 0; i < example.size(); i++ )
{
auto n = alpha_sym.find( example[i] );

if ( n != std::string::npos )
{
std::cout << n << " " << std::endl;
}
else
{
std::cout << example[i] << " " << i << " не содержится в алфавите" << std::endl;
++err;
}
}
}

它的输出是

1 
4
3
5
8
2
1
2

关于c++ - 为什么 string::find 的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56951544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com