可能重复:
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;
}
答案 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);
所以你的来源和目的地是错误的。