此代码应该询问用户他们的名字,然后将其拆分到空格处。
它应该将firstname放在变量中,将最后一个名称放在de variable lastname
中#include <iostream>
using namespace std;
int main()
{
char string[80];
char first[20];
char lastname[20];
bool f = true;
int c = 0;
cout << "Whats your Name? \n";
gets(string);
for(int i =0; i < strlen(string); i++){
if(string[i] == ' ') {
f = false;
c = 0;
}
if(f) {
first[c] = string[i];
} else if(!f) {
lastname[c] = string[i];
}
c++;
}
for(int i = 0; i < strlen(first); i++) {
cout << first[i] << "\n";
}
for(int i = 0; i < strlen(lastname); i++) {
cout << lastname[i]<< "\n";
}
return 0;
}
答案 0 :(得分:5)
除非你真的需要仅使用C函数编写它,否则使用C ++字符串会更容易。
类似(这是未经测试的):
std::string input;
std::string first;
std::string lastname;
// prompt the user
std::cout << "What's your name? ";
// get a line of input
std::getline(std::cin, input);
// find a space in the string
size_t space = input.find_first_of(" ");
// was the space found?
if (space != std::string::npos)
{
// copy out the first and last names
first = input.substr(0, space);
lastname = input.substr(space + 1);
// output them to stdout
std::cout << first << std::endl << lastname << std::endl;
}
这意味着您不必担心空终止字符串或字符串长度或类似的东西。正如flolo所说,你的代码不会这样做,因此肯定会遇到问题。 C字符串的内存布局是一个字符数组,末尾有一个空字节,这就像strlen()这样的东西知道字符串结尾的位置。此外,当有人输入一个超过20个字符的名字时,你的代码会有一段可怕的时间,这并不是特别难以置信。
答案 1 :(得分:1)
你没有说你的程序是如何表现错误的。但是我看到的一个错误是由于c字符串是0终止的。您必须添加“if ... == ”a
first[c]=0;
(在将c重置为0之前)和循环之后添加lastname[c]=0
。
答案 2 :(得分:1)
谈论艰难的做事。使用它会更容易
std::string
,但如果您坚持使用char[]
,请不要使用gets
(这是完全被打破的),但fgets
,其次,找到了结束
一劳永逸的字符串。所以(首选:
std::string line;
std::getline( std::cin, line );
if ( ! std::cin )
// Something when wrong...
typedef std::string::const_iterator Iter;
Iter begin = line.begin();
Iter end = line.end();
或:
char line[80];
if (fgets( line, stdin ) == NULL )
// Something went wrong...
typedef char const* Iter;
Iter begin = line;
Iter end = line + strlen( line );
if ( end != begin && *(end - 1) == '\n' )
--end;
然后找到第一个空格:
Iter pivot = std::find( begin, end, ' ' );
然后首先创建两个字符串,最后一个:
std::string first( begin, pivot );
std::string last( pivot == end ? end : pivot + 1 );
或
char first[80] = { '\0' }; // nul fill to ensure trailing '\0'
std::copy( begin, pivot, first );
char last[80] = { '\0' };
std::copy( pivot == end ? end : pivot + 1, end, last );
然后输出:
std::cout << first << std::endl;
std::cout << last << std::endl;
当然,如果您使用std::string
,则甚至无需创建
变量first
和last
;你可以输出一个临时的:
std::cout << std::string( begin, pivot ) << std::endl;
std::cout << std::string( pivot == end ? end : pivot + 1, end ) << std::endl;
答案 3 :(得分:0)
其他一些未提及的小问题:
if(f) {
first[c] = string[i];
} else if(!f) { // <- this "if" statement looks like you did not understand "if .. else"
lastname[c] = string[i];
}
所以写得更好:
if(f) {
first[c] = string[i];
} else {
lastname[c] = string[i];
}
部分
if(string[i] == ' ') {
f = false;
c = 0;
}
应该更好
if(string[i] == ' ') {
f = false;
c = 0;
continue;
}
因为否则您的lastname
将始终包含前导空格。