所以,我创建了一个程序,让用户输入他的全名,显示其首字母。 (使用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
。为什么呢?
答案 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];
}
}
}