C++ 作为字符数组输入

C++ 作为字符数组输入,c++,arrays,C++,Arrays,我试图以字符数组的形式获取输入并对其进行操作。例如,这就是我所拥有的。但是我刚刚开始使用数组,我对如何存储char数组感到困惑 void getMessage(char message[CHARACTERS]) { int i = 0; cout << "Enter message: "; for (i = 0; i < CHARACTERS; i++) { cin >&g

我试图以字符数组的形式获取输入并对其进行操作。例如,这就是我所拥有的。但是我刚刚开始使用数组,我对如何存储char数组感到困惑

   void getMessage(char message[CHARACTERS])
   {
        int i = 0;
        cout << "Enter message: ";
        for (i = 0; i < CHARACTERS; i++)
        {
            cin >> message[i];
            if (message[i] == NULL)
                break;
        }
            cout << "The message you entered was:" << endl << message[i] << endl;
   }
void getMessage(字符消息[字符])
{
int i=0;
cout>消息[i];
if(消息[i]==NULL)
打破
}

不能你在这里搞混了:

if (message[i] == NULL)
<>在C++中, null < /C> >被定义为一个宏,并被扩展为零,所以实际上你测试的是

if (message[i] == 0)
如果您是从终端或文本文件输入,这几乎是不可能的(您肯定不是以这种方式读取二进制文件!)。根据您的需要,将其更改为以下任意一项,然后它就可以工作了

// Input a line
if (message[i] == '\n') {
    message[i] = '\0'; // strip the newline
    break;
}
记住终止字符串也是一种很好的方式,以防您读取了所有缓冲区,并且
cout
将输出零字符之前的所有内容,这是一种潜在的访问冲突:

for (...) {...}
message[CHARACTERS - 1] = '\0'.

此外,您的输出语句也是错误的:

cout << "The message you entered was:" << endl << message[i] << endl;
因此,您使用的是
ostream&operator
//示例程序
#包括
#包括
使用名称空间std;
常量int字符=100;
void getMessage(字符消息[字符])
{
int i=0;
cout>message[i]无法像您的情况那样检测回车键,因此您需要使用较低级别的函数,如cin.get()
如果(消息[i]='\n'){
消息[i+1]='\';//这是一个用于字符串结束的C++标记,否则垃圾值将打印
打破
}
}

所以把所有这些放在一起,明显的现代C++方式来实现你想要的是:

#include <cstddef>
#include <iostream>
#include <memory>

using std::cout;
using std::flush;
using std::endl;
using std::cin;
using std::size_t;

template <size_t CHARACTERS>
void getMessage(char(& message)[CHARACTERS]) {
  int i = 0;
  cout << "Enter message: " << flush;

  for (i = 0; i < CHARACTERS; i++) {
    if (!cin.get(message[i])
      || message[i] == '\0'
      || message[i] == '\r'
      || message[i] == '\n') {
      message[i] = '\0';
      break;
    }
  }
  cout << "The message you entered was:" << endl << message << endl;
}

int main() {
  char message[200];
  getMessage(message);
  return EXIT_SUCCESS;
}
#包括
#包括
#包括
使用std::cout;
使用std::flush;
使用std::endl;
使用std::cin;
使用std::size\u t;
样板
void getMessage(字符和消息)[字符]){
int i=0;

无法为语言添加标记未解决的问题是,如果缓冲区已填充,它将不会“\0”终止,然后会发生不好的事情™ 抱歉,但是现代C++方法是使用<代码> STD::String < /Calp>而不是字符数组。OP使用字符数组。看起来很重要。我没有投票否决这个问题,但是你想把循环条件调整成i个字符- 1。否则,当i=99和消息[i]时,你会访问数组外。='\n'。或者将'\n'替换为'\0'。。。
cout << "The message you entered was:" << endl << message[i] << endl;
... << message << ....
// Example program
#include <iostream>
#include <string>

using namespace std;

const int CHARACTERS = 100;

void getMessage(char message[CHARACTERS])
   {
        int i = 0;
        cout << "Enter message: ";
        for (i = 0; i < CHARACTERS-1; i++)
        {
            message[i] = cin.get(); // cin >> message[i] can't detect enter press as was in your case, so you need to use a lower level function like cin.get()
            if (message[i] == '\n'){
                message[i+1] = '\0'; // This is a c++ marker for end of string otherwise garbage values will print
                break;
            }
        }
            cout << "The message you entered was:" << endl << message << endl; //You were printing only one letter of the message
   }

int main()
{
    char inputArray[CHARACTERS];
    getMessage(inputArray);
}
#include <cstddef>
#include <iostream>
#include <memory>

using std::cout;
using std::flush;
using std::endl;
using std::cin;
using std::size_t;

template <size_t CHARACTERS>
void getMessage(char(& message)[CHARACTERS]) {
  int i = 0;
  cout << "Enter message: " << flush;

  for (i = 0; i < CHARACTERS; i++) {
    if (!cin.get(message[i])
      || message[i] == '\0'
      || message[i] == '\r'
      || message[i] == '\n') {
      message[i] = '\0';
      break;
    }
  }
  cout << "The message you entered was:" << endl << message << endl;
}

int main() {
  char message[200];
  getMessage(message);
  return EXIT_SUCCESS;
}