strcmp inside if 在函数内部不起作用

Posted

技术标签:

【中文标题】strcmp inside if 在函数内部不起作用【英文标题】:strcmp inside if does not work inside function 【发布时间】: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中可以做些什么来解决这个问题?

【问题讨论】:

【参考方案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()

以上是关于strcmp inside if 在函数内部不起作用的主要内容,如果未能解决你的问题,请参考以下文章

c语言定义函数实现strcmp功能

strcmp 等效于 PHP 中的整数 (strcmp)

C语言问题。。。strcmp怎么运用啊?

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作

c++中strcmp函数如何使用??

在没有语法错误的情况下,此代码中的 if 情况不起作用