如何编写一个程序来乘以字符串?

时间:2015-12-26 20:47:09

标签: c++

我必须为一个类似的场景编写一个程序,

  1. 字符和<>
  2. 之间的数字
  3. 单词和[]
  4. 之间的数字
  5. 句子和()之间的数字

    最后要打印那么多次。 例子:

  6. 样本: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号码。

    先谢谢

3 个答案:

答案 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;

正在使用它作为最终数字。

如果找到更多数字,您需要存储该号码并继续添加。

  1. 在循环之前声明o并初始化0
  2. 继续在循环中添加。
  3. 将打印循环移出外循环。
  4. // 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::stringstd::string::find_first_ofstd::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);

鉴于我们现在有startPosendPos,我们知道这个数字在哪里。我们需要做的就是获取此字符串并将其转换为整数:

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)");
}

Live Example

请注意,我们假设输入有效。示例代码中没有错误检查。