操纵字符串c ++

时间:2015-11-08 17:38:20

标签: c++ arrays string

我正在上课,我遇到了问题。

该计划的目标是让用户

  • 输入他们的第一个名字。
  • 然后程序会要求输入昵称。
  • 最后程序会输出你的

    1. 名字
    2. 昵称引号中的所有上限
    3. 姓氏

可以找到更详细的说明版本here

所以我的问题在于我将如何操纵字符串以将昵称放在第一个和最后一个之间。

我使用cin.getline()在开头输入名字和姓氏。 我似乎无法在字符串中找到姓氏。有没有办法在字符串中的某个位置之后将字符串/ char []读入另一个字符串。

就好像某个c ++本机库中有一个函数(伪代码)

readFromPoint(array, otherArray, beginPoint, stopPoint);

或者我只是要建立自己的循环。

我想将我的名字和姓氏输入一个字符串。然后将它们分成两个单独的字符串。然后我将(第一个,昵称,最后一个)放入第一个原始字符串中。

我知道如果我只使用了两个cin语句,它可以为我节省很多心痛。 (我相信我已经听过其他人称之为危险)

这是我的代码:

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

char Name[46], // the full names leangth - 2
     firstName[16],
     lastName[16],
     nickName[16];
     int numOSpaces;

//void rearrangeName();
int FindSpace(string, int);
int FindNull(string);
int main(){

    cout << "Pleast enter your first then last name...\n";
    cin.getline(Name, 30);
    int ender =  FindSpace(Name, strlen(Name));

    // here we check if you entered the right amount of spaces
    while (numOSpaces > 1 || numOSpaces < 1){
        if (numOSpaces > 1)
        cout << "There are too many spaces only put one space:\n";
        if (numOSpaces < 1)
        cout << "Please separate your first and last name:\n";
        cin.getline(Name, 30);
        ender =  FindSpace(Name, strlen(Name));
    }

    cout << "Hello " << Name <<".\n";

    cout << "\n\nEnter your nickname...\n";\

    cin.getline(nickName, 30);
    cout << "Whats up " <<nickName << "!" << endl << endl;

    // Now we separate the first name and the last name 
    //rearrangeName();
}

// used to tell where user stopped inputting into the string
int FindNull(string find){
    int index = 0;
    do{
        index++;
    }while (isprint(find[index])); // this stops at the null terminator
//      }while (find[index] != '\0');  // as will this 
    return index;
}   

// here we find the first space 
int FindSpace(string mystring, int size){
    int Space;
    int spaceCount = 0;
    for (int index; index < size; index++){
        if (isspace(mystring[index])){
            Space = index;
            spaceCount++;
        }
    }
    numOSpaces = spaceCount;
    return Space;
}

void findName(string fullName, string otherName){

}

如果我想转向这个,我当然不能使用任何外部库。只有那些原生于C ++的人。

3 个答案:

答案 0 :(得分:2)

看一下这个程序,使用std::string可以很好地完成你的工作,因为它有findinsert等奇特的功能: -

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string name, nickname;
    getline(cin,name);
    getline(cin,nickname);
    nickname.insert(0," ");     // insert a space before nickname
    int pos = name.find(" ");   // find where space is becuase space separates first & last name
    name.insert(pos, nickname);     // insert nickname at the space, it doesn't trouble because we have a space before nickname
    cout << name;
    return 0;
}

输出将是: -

Ankit Acharya
Programmer
Ankit Programmer Acharya 

希望这能很好地解决你的问题!!

答案 1 :(得分:0)

您没有使用cin.getline()获取姓氏的原因是因为它只获取它在空格之前看到的第一个字符串。重复cin.getline()两次(或使用以下代码)以获取名字和姓氏:

std::string firstName, lastName;
std::cin >> firstName >> lastName;

这仅使用<iostream><cstring>附带的原生c ++内容。 如果您需要任何帮助将昵称转换为大写字母,请告诉我。

编辑:除非你被迫,否则永远不要使用c样式字符串;您需要的所有工具都包含在<string>

答案 2 :(得分:0)

如果您使用std::string,您将会有更轻松的时间。

#include <iostream>
#include <string>

void capitalize(std::string& str) {
  for(size_t i = 0; i < str.length(); ++i) {
    str[i] = toupper(str[i]);
  }
}

int main() {
  std::string first_name, last_name, nickname;
  std::cout << "Enter full name: " << std::endl;
  std::cin >> first_name >> last_name;
  std::cout << "Enter nickname: " << std::endl;
  std::cin >> nickname;

  capitalize(nickname);

  std::cout << first_name << " \"" << nickname << "\" " << last_name << std::endl;
}

这是ideone,全名为“Hello World”,昵称为“nickname”。