【问题标题】:strcmp inside if does not work inside functionstrcmp inside if 在函数内部不起作用
【发布时间】:2020-01-15 04:13:19
【问题描述】:

我正在编写一个函数,它接收多个数组作为参数,如下:

const int numofparticles = 20;
const int numofdims = 46;
const int numforn = 222;
const int forn_sem_repet = 92;

float cost(float x[numofdims], float M[numofdims][numforn], char prod[numofdims][102], char forn_list[numforn][102], float qtde[numofdims][1], float min_prices[forn_sem_repet], char min_forn[forn_sem_repet][102]){
    float v = 0;
    vector<string> forn;
    vector<float> total;
    int i;
    int j;
    for(i=0;i<numofdims;i++){
        if(x[i] != -1){
            forn.push_back(forn_list[(int)x[i]]);
            total.push_back(qtde[i][1] * M[i][(int)x[i]]);
            for(j=i+1;j<numofdims;j++){
                if(strcmp(forn_list[(int)x[j]],forn.back()) == 0){
                    total.back() += qtde[j][1] * M[j][(int)x[j]];
                    x[j] = -1;
                }
            }
        }
        else{
            continue;
        }
    }
    for(i=0;i<numofdims;i++){
        v += qtde[i][1] * M[i][(int)x[i]];
    }
    int lin;
    for(i=0;i<forn.size();i++){
        for(int ii=0;ii<forn_sem_repet;ii++){
            if(strcmp(forn[i],min_forn[lin]) == 0){
                lin = ii;
                break;
            }
        }
        if(total[i] < min_prices[lin]){
            v += 1000;
        }
    }

    return v;
 }

它在strcmp() 中都返回一个错误。

error: cannot convert ‘__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> > >::value_type {aka std::__cxx11::basic_string<char>}’ to ‘const char*’ for argument ‘2’ to ‘int strcmp(const char*, const char*)’
                 if(strcmp(forn_list[(int)x[j]],forn.back()) == 0){

error: cannot convert ‘__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> > >::value_type {aka std::__cxx11::basic_string<char>}’ to ‘const char*’ for argument ‘1’ to ‘int strcmp(const char*, const char*)’
             if(strcmp(forn[i],min_forn[lin]) == 0){

但是,在main函数中,加载所有变量后,循环。

for(i=0;i<numforn;i++){
            for(j=0;j<forn_sem_repet;j++){
                if(strcmp(forn_list[i],min_forn[j]) == 0){
                    printf("%s\n%s  %d  %d", forn_list[i],min_forn[j],i,j);
                    printf("\n\n");
                    break;
                }

            }
        }

完全按预期工作。

在函数cost中可以做些什么来解决这个问题?

【问题讨论】:

    标签: c++ arrays string


    【解决方案1】:

    在函数中,您声明了vector&lt;string&gt; forn;,这与if(strcmp(forn_list[(int)x[j]],forn.back()) == 0){ 行不兼容,因为strcmp 只能将C 风格的char* 字符串作为参数,而不是std::string。这正是编译器所抱怨的。

    要使您的代码正常工作,请将该行中的 forn.back() 替换为 forn.back().c_str()

    【讨论】:

    • 我相信正确的替换是forn.back().c_str()
    猜你喜欢
    • 2016-05-27
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多