如何限制char数组只从c ++中的字符串中取出一个&b;和b?

时间:2017-12-01 21:33:51

标签: c++ arrays string

我有一个程序,它接受字符串并将其转换为char数组。我想创建没有正则表达式库的正则表达式,该库接受在某处具有aa的所有字符串和b#。

我的下面的代码工作正常,但唯一的问题是它接受除了&b和s以外的字符,例如它也接受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");   
}

1 个答案:

答案 0 :(得分:1)

无效字符的问题

在你的循环体中,你必须拒绝那些既不是b也不是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_string)没有回复你的期望!请改用input_string.size()

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

 if(counter>=2){  // instead of ==

哎呀!

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

  1. 使用<iomanip>限制接受的用户输入的大小(例如cin >> setw(19) >>input_string;

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

  3. 您可以直接访问input_string中的原始字符,而无需进行任何复制。或者如果您愿意,可以使用可从字符串初始化的向量重新设置char数组:vector<char>char_string(input_string.begin(), input_string.end());

  4. Online demo of option 3