连接只有在它感觉到时才有效?

时间:2014-12-22 08:38:39

标签: c++ string

我正在尝试使用以下代码:

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <cmath>

using namespace std;

bool prime_test(int num);
void stringRotation(string& str);

int main()
{
    vector<string> primes;
    ifstream infile("PRIMES1T.txt");

    // checks to see if there was any problems opening the .txt
    if (infile.is_open()) {
        string line = "";
        while(getline(infile,line)) {
            primes.push_back(line);
        }

        // rotates our string and tests if the number is still prime
        vector<string> primes2;
        for (int i = 0; i < primes.size(); i++) {
            string str = primes[i];
            for (int j = 0; j < str.length(); j++) {
                stringRotation(str);
                int value = atoi(str.c_str());
                if (prime_test(value) == false) {
                    break;
                }
                if (j == str.length()-1) {
                    if (prime_test(value) == true) {
                        primes2.push_back(primes[i]);
                    }
                }
            }
        }

        cout << "There are " << primes2.size() << " primes that work.";
        cout << endl;
    }
    else {
        cout << "File failed to open." << endl;
    }

    return 0;
}

// tests to see if num is a prime number
bool prime_test(int num) {
    if (num == 1) {
        return false;
    }
    // Finds first integer value larger than the sqrt of num
    // since that is all we really need.
    double dnum = num;
    double sqrt_dnum = sqrt(dnum);
    int counter = ceil(sqrt_dnum);

    for (int i = 2; i < counter; i++) {
        if (num == 2) {
            break;
        }
        if (num%i == 0) {
            return false;
        }
    }
    return true;
}

// rotates a string
void stringRotation(string& str) {
    int len = str.length();

    // converts a char variable into a string variable
    stringstream ss;
    string ch;
    char c = str.at(0);
    ss << c;
    ss >> ch;

    str = str.substr(1,str.length());
    str = str.append(ch);
    cout << str << endl;
}

它做的是需要素数999983,切断第一个数字9,然后将其添加到数字的其余部分的末尾,以便它吐出新的数字999839.然后测试是否或不是这个新的数字是素数还是没有,并重复该过程,直到返回原始数字。如果每次我们执行此过程时数字都是素数,那么我们将该数字添加到矢量primes2。

我遇到的问题是stringRotation函数由于某种原因无法正常工作。我已经通过尝试在添加已删除的数字之前输出字符串并在添加数字后输出字符串来测试它。它没有正确连接。它将切断999983中的第一个数字,这样我们就有str ='99983'和ch ='9',但是当我做str.append(ch)时,它仍然给了我99983.我也尝试了类似str =的变量str.append(ch)和str = str + ch。

我尝试将函数复制到另一个.cpp文件,只编译为str添加一个声明,方法是将str设置为“999983”并且工作正常。

修改 我将stringRotation更改为:

void stringRotation(string& str) {
    int len = str.length();
    char ch = str.at(0);

    cout << ch << endl;

    str = str.substr(1,str.length());
    str.append(1,ch);
    cout << str << endl;
}

但问题仍然存在。我也尝试过string.push_back(ch)而没有运气。

1 个答案:

答案 0 :(得分:1)

在您的程序员职业生涯中,您需要始终确保您的输入得到妥善处理。如果要从不保证具有特定内容方案的文件加载数据,则始终需要确保在解析之前准备数据。在这种特殊情况下,您需要确保您的“数字”确实是数字,然后对保证为数字的值执行stringRotation