3
\$\begingroup\$

Is it considered bad practice to pass string literals as char*, when an array and not a c-string is expected by the function? From my code:

char ConsoleIO::GetNextChar(string prompt, char* choices, int numChoices) {
 // Loop until valid input, or 10 times.
 for (int i = 0; i < 10; i++) {
 Write(prompt);
 char* buffer = new char[200];
 cin.getline(buffer, 200);
 char choice = tolower(buffer[0]);
 if (in(choice, choices, numChoices)) {
 return choice;
 }
 WriteLine("Invalid choice.");
 }
 // Just return the first choice as the default.
 return choices[0];
}
// In main:
char userChoice = ConsoleIO::GetNextChar("Make a selection: ", "234", 3);

It compiles, but is it bad practice?

asked Dec 5, 2015 at 20:02
\$\endgroup\$
2
  • 1
    \$\begingroup\$ How does this even compile? "234" is a const char[] which cannot be converted to a char *. You should at least get a warning. \$\endgroup\$ Commented Dec 6, 2015 at 11:16
  • \$\begingroup\$ Nope, I don't even get a warning on this. My guess is that since it's not by-ref the constness can be ignored, and char[] and char* are really the same thing in c++, it allows me to pass a const char[] as a char*. \$\endgroup\$ Commented Dec 7, 2015 at 15:30

1 Answer 1

5
\$\begingroup\$

When a C or C-related programmer sees char* they're going to naturally think of passing in a C-string. In my opinion, it's absolutely fine to do that. If you want to invoke an array of characters in C, I'd do it like this:

char ConsoleIO::GetNextChar(string prompt, char[] choices, int numChoices)

But, you're in C++ so you should use a std::vector<char> and then don't pass in numChoices, like this:

char ConsoleIO::GetNextChar(string prompt, std::vector<char> const& choices)

Also, you have a bug. You aren't ever deleteing buffer, which means it's leaking.

answered Dec 6, 2015 at 1:56
\$\endgroup\$
3
  • \$\begingroup\$ I appreciate the input, especially on the memory leak. Thanks! \$\endgroup\$ Commented Dec 6, 2015 at 2:01
  • \$\begingroup\$ I suggest use of std::vector<char> const& choices. \$\endgroup\$ Commented Dec 6, 2015 at 8:30
  • \$\begingroup\$ @RSahu Excellent point! I'll update it. \$\endgroup\$ Commented Dec 6, 2015 at 15:33

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.