我有一个程序,它接受字符串并将其转换为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");
}
答案 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()
将复制比阵列中的位置更多的字符,从而导致内存损坏。您可以用来纠正此问题的策略:
使用<iomanip>
限制接受的用户输入的大小(例如cin >> setw(19) >>input_string;
使用strncat()
限制副本的大小,并通知用户输入是否被截断。然后,您还必须确保循环不会超出截断的大小。
您可以直接访问input_string
中的原始字符,而无需进行任何复制。或者如果您愿意,可以使用可从字符串初始化的向量重新设置char数组:vector<char>char_string(input_string.begin(), input_string.end());