使用char数组

时间:2018-01-25 21:07:33

标签: c++ arrays strlen

所以,我创建了一个程序,让用户输入他的全名,显示其首字母。 (使用char array,因此名称将以空格分隔。)

这是我的代码:

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
   char name[100];
   cout << "Name: "; cin >> name;
   cout << name[0];
   for (int i = 1; i<=strlen(name); i++)
      if (name[i] == 32)
         cout << name[i+1];
   return 0;
}

它将找到名称之间的空格,将显示的内容是数组中的第一个元素和空格后面的下一个元素。

例如,如果我输入:John Doe,则输出将为:J D

我的问题是,它只显示J。为什么呢?

2 个答案:

答案 0 :(得分:2)

因为std::cin >> name只会在遇到空格之前读取字符。

尝试使用std::getline读取整行(读取直到换行符)。

std::string s;
std::getline(std::cin, s);
std::cout << s[0] << " " << s[s.find(' ') + 1] << std::endl;

注意:上面没有边界检查,例如,如果找不到空格。

答案 1 :(得分:1)

std::cin >> name从输入流中读取单个单词。它从未读过第二个字。

您可以使用std::getline() [1]阅读整行输入,也可以使用std::cin >> word在循环中阅读单个单词。

无论哪种方式,我强烈建议使用std::string而不是C字符串。 strlen(name)必须计算循环的每个迭代器上的字符串长度。

您还可以使用i <= strlen(name)阅读字符串末尾并阅读name[i+1]

这样的事情应该有效(未经测试):

#include <iostream>
#include <string>

int main() {
   std::string name;
   std::getline(std::cin, name);

   for (std::size_t i = 0; i < name.size(); i++) {
      if (i == 0 || name[i - 1] == ' ') {
        std::cout << name[i];
      }
   }
}