通过比较字符串到数组

时间:2015-10-16 11:26:11

标签: c++ arrays string reference

我正在处理一个函数,该函数将用户输入作为main的引用,并将其与存储字母表的字符串数组进行比较。我的目标是使函数计数user_string中每个字母的出现次数。这是我到目前为止所得到的:

int letter_counter(string user_Text_Ref)
{
    string alfa_arr[LETTERS] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
    int antal_arr[LETTERS] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    int i, j;

    for(i = 0; i < LETTERS; i++)
    {
        for(j = 0;j < sizeof(user_Text_Ref) ; j++)
        {
            if(alfa_arr[i] == user_Text_Ref(j)) // Here is my problem.
            {
                antal_arr[i] += 1;
                cout << alfa_arr[i] << " : " << antal_arr[i] << endl;
            }
            else
            {
                continue;
            }
        }
    }
return antal_arr;
}

所以要快速总结一下这是什么。函数letter_counter引用来自main的用户提交的字符串作为参数。 LETTERS是一个设置为26的const int。 alfa_arr包含所有小写字母a-z和antal_arr包含 对应于字母的数字,用于记录所有字母的出现次数 这些信。 第一个for循环遍历所有字母,第二个循环遍历字符串user_Text_Ref,它就在那里,我很困惑。

我尝试了几种方法来比较alfa_arr [i]和user_Text_Ref(==,strcmp及其变体和一些我不记得的) 我收到一个我不理解的错误(我使用的是代码块):

error: no match for call to ‘(std::string {aka std::basic_string<char>}) (int&)’|

这是什么意思?

在这种情况下比较两个字符串的最佳方法是什么?

你可以创建一个包含字符串和整数的多维数组吗?

我仍然是c ++的新手,感谢任何帮助或建议。 感谢您抽出宝贵时间阅读我的问题。

干杯!

3 个答案:

答案 0 :(得分:0)

错误意味着您正在尝试将字符串用作函数。要从中获取单个字符,请使用[],而不是()。这样就可以为字符串中的单个字符建立索引。

if(alfa_arr[i] == user_Text_Ref[j])

其次,您有alfa-arr中字符的字符串数组。您很可能希望在那里存储单个字符,并与从字符串迭代的字符进行比较。

char alfa_arr[LETTERS] = { 'a', 'b', ... };

第三,要获得字符串的长度user_Text_Ref.length()sizeof只会给出在这种情况下为该对象分配的内存大小。

答案 1 :(得分:0)

应该是

user_Text_Ref[j]

另请注意,您只需从该字母中减去'a'即可找到一封信的编号:

for(j = 0;j < user_Text_Ref.length(); j++) { // sizeof is also a problem here
    if (user_Text_Ref[j]>='a' && user_Text_Ref[j]<='z') { // if this is a letter
        pos =  user_Text_Ref[j] - 'a'; // find its number but sbtracting 'a' code from its code
        antal_arr[pos] ++;
        cout << user_Text_Ref[j] << " : " << antal_arr[pos] << endl;
    }
}

所以你根本不需要alfa_arr数组。

答案 2 :(得分:0)

您可以使用此代码实现目标......

#include <iostream>
#include <algorithm>

using namespace std;

const int LETTERS = 26;

void letter_counter(string str, int* p) {

    // fill up alphabet array
    char alfa_arr[LETTERS] = { 0 };
    for (int i = 0; i < LETTERS; i++) {
        alfa_arr[i] = static_cast<char>(i + 97);
    }

    // convert string to lowercase
    transform(str.begin(), str.end(), str.begin(), ::tolower);

    // fill up occurrences array
    for (int i = 0; i < LETTERS; i++) {
        *p++ = count(str.begin(), str.end(), alfa_arr[i]);
    }
}

int main() {

    int antal_arr[LETTERS] = { 0 };
    int* p = nullptr;
    string str{"This program counts letter OCCURRENCES in TEXT despite CASE"};  

    // fill occurrences array
    p = &antal_arr[0];
    letter_counter(str, p);

    // show results
    for (int i = 0; i < LETTERS; i++) {
        cout << antal_arr[i] << endl;
    }

    return 0;
}

请注意, letter_counter 不会返回int类型。相反,它填充了一个外部的int数组。