C++ 如何限制字符数组只使用';s和b';s来自c+中的字符串+;?

C++ 如何限制字符数组只使用';s和b';s来自c+中的字符串+;?,c++,arrays,string,C++,Arrays,String,我有一个程序,它把字符串转换成字符数组。我想创建不带正则表达式库的正则表达式,它接受a和b的所有字符串,其中a和b的aa在某处 我下面的代码工作正常,但唯一的问题是它接受a和b以外的字符,例如它也接受baabss。 您能否帮助更正代码,使其在这种情况下拒绝字符串 #include <iostream> #include <fstream> #include <string> using namespace std; int main() { stri

我有一个程序,它把字符串转换成字符数组。我想创建不带正则表达式库的正则表达式,它接受a和b的所有字符串,其中a和b的
aa
在某处

我下面的代码工作正常,但唯一的问题是它接受a和b以外的字符,例如它也接受
baabss
。 您能否帮助更正代码,使其在这种情况下拒绝字符串

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    string input_string;
    char char_string[20];
    int counter=0;

    cout << "type in some input text:$" << endl;
    cin >> input_string;

    strcpy(char_string, input_string.c_str());

    for (int i = 0;  i < sizeof(input_string); i++)
    {
        if(char_string[i]=='a' || char_string[i]=='b'){
            switch(char_string[i])
            {
             case 'a' :
                 counter++;
                 break;              
             case 'b' :
                 if(counter==1){
                     counter=0;
                 }               
                 break;
            }
         }
     }

     if(counter==2){
        cout << "String accepted" << endl;
     }
     else{
        cout << "String not accepted" << endl;
     }
     std::cin.get();
     system ("PAUSE");   
}
#包括
#包括
#包括
使用名称空间std;
int main(){
字符串输入_字符串;
字符字符串[20];
int计数器=0;
无法输入_字符串;
strcpy(char_string,input_string.c_str());
for(int i=0;i无法解决无效字符的问题

在循环体中,必须拒绝既不是a也不是b的字符。因此必须完成

   if(char_string[i]=='a' || char_string[i]=='b'){
       ...
   }
带有
else
子句。例如:

   else {
       counter=0;   // reset the counter so that the final check will fail
       break;       // exit the for loop
   } 
到目前为止尚未检测到的问题

第一个问题是
sizeof(input\u string)
不会返回您期望的结果!请改用
input\u string.size()

然后程序将无法接受
baaab
,因为它将导致循环以计数器为3结束。因此,您必须将最终检查更改为:

 if(counter>=2){  // instead of ==
哎呀!

最后,如果用户输入的字符超过19个,则程序将具有未定义的行为,因为
strcpy()
将复制比数组中更多的字符,从而导致内存损坏。可用于纠正此问题的策略:

  • 使用(例如,
    cin>>setw(19)>>input\u string;

  • 使用
    strncat()
    限制副本的大小,并在输入被截断时通知用户。然后还必须确保循环不会超出截断的大小

  • 您可以直接访问
    input\u string
    中的原始字符,而无需进行任何复制。或者,如果愿意,您可以使用从字符串初始化的向量重新放置字符数组:
    vectorchar\u string(input\u string.begin(),input\u string.end());


  • 为什么需要转换为字符数组?
    运算符[]
    将使用
    std::string
    。我这样做是为了将每个字符与开关匹配statement@Inam问题是,如果字符串具有外部属性,则不会拒绝该字符串char@JakeFreeman...谢谢,先生我现在明白了我跳过了其他部分working@Inam你能支持我的评论吗?christphe…谢谢你先生我现在明白了很好…你很棒