警告:不推荐将字符串常量转换为'char *'

时间:2012-09-16 23:27:18

标签: c++

  

可能重复:
  C++ deprecated conversion from string constant to ‘char*’

我正在研究C ++中的字符串并尝试练习来测试字符串库中定义的一些函数的行为。我昨天编译了同样的程序,一切都没有警告或错误。但是,今天我尝试再次编译程序,但是我收到了以下警告。

D:\C++ CodeBlocks Ex\Strings\main.cpp||In function 'int main()':|
D:\C++ CodeBlocks Ex\Strings\main.cpp|11|warning: deprecated conversion from string constant to 'char*'|
||=== Build finished: 0 errors, 1 warnings ===|

警告引用此行strncat("Hello",string,STRMAX-strlen(string));。我不确定,但我怀疑是strncat函数不喜欢必须连接文字数组和字符串常量的想法。对此的任何帮助将不胜感激。

#include <iostream>
#include <string.h>

using namespace std;

int main(){
    #define STRMAX 599
    char string[STRMAX+1];
    cout<<"Enter name: ";
    cin.getline(string,STRMAX);
    strncat("Hello",string,STRMAX-strlen(string));
    cout<<string;
    return 0;
}

4 个答案:

答案 0 :(得分:5)

您以错误的顺序向strncat()提供参数。第一个参数是要追加的字符串;第二个参数是要追加的字符串。如上所述,您尝试将输入string添加到常量字符串"Hello",这是不行的。您需要将其写为两个单独的字符串操作。

使用std::string课程可以为您带来很多悲伤。

答案 1 :(得分:4)

由于您使用的是C ++,我建议您避免使用char*并使用std::string。 如果您需要传入char*,则字符串类具有c_str()方法,该方法以const char*的形式返回字符串。

使用字符串类时的连接就像"Hello " + "World!"一样简单。

#include <iostream>
#include <string>

const int MaxLength = 599;

int main() {
    std::string name;

    std::cout << "Enter a name: ";
    std::cin >> name;

    if (name.length() > MaxLength) {
        name = name.substr(0, MaxLength);
    }

    // These will do the same thing.
    // std::cout << "Hello " + name << endl;
    std::cout << "Hello " << name << endl;

    return 0;
}

这并不能完全回答你的问题,但我想这可能会有所帮助。

答案 2 :(得分:3)

更好的编写方法是使用字符串类并完全跳过char。

#include <iostream>
#include <string>

int main(){
    std::string name;
    std::cout<<"Enter name: ";
    std::getline(std::cin, name);
    std::string welcomeMessage = "Hello " + name;
    std::cout<< welcomeMessage;
    // or just use:
    //std::cout << "Hello " << name;
    return 0;
}

答案 3 :(得分:1)

char * strncat(char * destination, const char * source, size_t num);

所以你的来源和目的地是错误的。