我必须为一个类似的场景编写一个程序,
句子和()之间的数字
最后要打印那么多次。 例子:
样本:1
Input: A<4>
Output: A A A A
样本:2
Input: good[3]
Output: good good good
样本:3
Input: A is good. (2)
Output: A is good. A is good.
这是我的代码:
#include <iostream>
using namespace std;
int main()
{
char a[1000];
cout<< "Enter a char, word or sentece:" << endl;
gets(a);
int i;
for(i=0;a[i];i++);
int n=i, k , l=0, m=0;
while(1){
for(k=l;a[k]!='<'&&a[k]!='('&&a[k]!='[';k++);
m=k;
int o=int (a[m+1])-48;
int u=0;
for(i=1;i<=o;i++)
for(u=l;u<m;u++)
{
cout<<a[u];
}
if(m+2==n-1)
return 0;
l=m+3;
}
}
它适用于1-9号码。
先谢谢
答案 0 :(得分:1)
在这里,我发现代码中存在两个主要错误。
错误#01:
仅适用于0-9个数字。
原因:
您只是在<
,(
或[
后检查一个号码,实际上您需要迭代该号码的数字。然后通过将前一个数字乘以10并添加下一个数字来找到确切的数字。
错误#02:
它没有终止,
while
循环是一个无限循环。
原因:
if
的{{1}}条件有误,仅当您的数字为return
时才有效。所以你还需要更新终止条件。当您在循环中检查one-digit number
的大小时,您可以满足此要求。
我对您的代码进行了一些更改,现在它运行正常。
更新代码:
digit
希望这有帮助。
答案 1 :(得分:0)
它适用于1-9号码。
您正在提取行中的数字
int o=int (a[m+1])-48;
正在使用它作为最终数字。
如果找到更多数字,您需要存储该号码并继续添加。
o
并初始化0
。// Initialize o
int o = 0;
while(1){
for(k=l; a[k]!='<' && a[k]!='(' && a[k]!='['; k++);
m=k;
// Add to o
for(++k; a[k]!='>' && a[k]!=')' && a[k]!=']'; k++)
{
o = 10*o + a[k]-'0';
}
if(m+2==n-1)
return 0;
l=m+3;
}
// Print
for(i=1;i<=o;i++)
for(int u=l;u<m;u++)
{
cout<<a[u];
}
免责声明:代码未经测试。
答案 2 :(得分:0)
如果你真的想以“C ++方式”这样做,那么你需要使用std::string
,std::string::find_first_of和std::string::substr。
首先,我们知道要查找哪些符号开始并终止数字序列:
const char* symbolStart = "(<[";
const char* symbolEnd = ")>]";
std::string test = "A<4>"; // for example
接下来要发现这个数字:
size_t startPos, endPos;
startPos = test.find_first_of(symbolStart);
startPos
将指向与symbolStart
中的任何内容匹配的第一个字符。接下来我们找到终止字符的位置:
endPos = test.find_first_of(symbolEnd, startPos);
鉴于我们现在有startPos
和endPos
,我们知道这个数字在哪里。我们需要做的就是获取此字符串并将其转换为整数:
std::string num = test.substr(startPos+1, endPos - startPos - 1);
value = atoi(num.c_str());
我们现在有了这个号码,现在我们需要做的就是在startPos
之前重复写一次字符串:
text = test.substr(0, startPos);
for (int i = 0; i < value; ++i)
std::cout << text << " ";
所以把它们放在一起(创建一个函数repeater
来测试它):
#include <string>
#include <iostream>
using namespace std;
void repeater(const std::string& test)
{
const char* symbolStart = "(<[";
const char* symbolEnd = ")>]";
// get start and end of number
size_t startPos = test.find_first_of(symbolStart);
size_t endPos = test.find_first_of(symbolEnd, startPos + 1);
// extract the number
string num = test.substr(startPos + 1, endPos - startPos - 1);
// get the value
int value = atoi(num.c_str());
string text = test.substr(0, startPos);
// output repeated text
for (int i = 0; i < value; ++i)
cout << text << " ";
cout << "\n";
}
int main()
{
repeater("A<50>");
repeater("good[3]") ;
repeater("A is good. (2)");
}
请注意,我们假设输入有效。示例代码中没有错误检查。