I am having an issue with trying to send a ("msg") from main to a Object(char arr[]).
InputNum(char msg [])
{
cout << msg;
cin >> _num;
}
int main()
{
InputNum num ("Enter a Number");
}
The above throws an error from the g compiler:
ISO C forbids converting a string constant to ‘char*’ [-Wwrite-strings]
So, I am sending a String in main to a char[ ] parameter. But I'm not sure why that is a problem. I was under the illusion that a char[ ] IS a String, which I guess is incorrect is incorrect. Any general advice on what and how to fix it, I would appreciate greatly.
Also, code is inspired by p.44 "C In Action" by Bartosz Milewski (2001).
Editted: greatly :p
CodePudding user response:
There are several problems with your given code.
Mistake 1
The type of the parameter msg in you function InputNum is actually a char* i.e., a pointer to char. This is because char[] decays to char* in case of pass by value. Meanwhile "Enter a Number" is a string literal of type const char[15] which decays to const char*. Thus, you're essentially passing a const char* as an argument where the parameter is of type char*. That is, there is mismatch in type of argument passed and the parameter msg.
To solve this you should add a low-level const to the parameter msg as shown below:
//-------vvvvv--------------->note the const added here
InputNum(const char msg [])
{
cout << msg;
}
Mistake 2
You've not specified the return type of the function InputNum. To solve this you should add void as the return type as shown below:
//vvvv-------------------------------> note void added as return type here
void InputNum(const char msg []) {
cout << msg;
}
Mistake 3
You should remove num from the statement InputNum num ("Enter a Number"); as shown below:
//------v------------------->num removed from here
InputNum ("Enter a Number");
Solution 1
Here is the complete modified solution incorporating all the above 2 solutions.
void InputNum(const char msg [])
{
std::cout << msg;
}
int main()
{
InputNum ("Enter a Number");
}
Solution 2
You can also use std::string as shown below:
void InputNum(const std::string& msg)
{
std::cout << msg;
}
int main()
{
InputNum ("Enter a Number");
}
CodePudding user response:
You are trying (unknowingly) to make a string literal writable. C doesnt like this at all.
You have to do
void InputNum(const char msg []) {
cout << msg;
}
this promises the compiler that you wont try to change the conents of 'msg'
