Привет, я пытаюсь написать программу c++, где пользователь вводит имя, например, говорит: Tahmid Alam Khan Rifat и компьютер распечатывают отформатированную версию имени, которое в этом случае будет: Mr. TAK Rifat. Я включил код ниже. Вы сможете увидеть, что я приблизился, но все еще не совсем то, что хотел. Пожалуйста помоги.
#include<iostream>
#include<string>
using namespace std;
class myclass{
private:
string name,temp;
string p;
int i,j,sp;
public:
void work(){
cout << "Enter the name of the male student: ";
getline(cin,name);
cout << endl;
cout << "The original name is: ";
cout << name;
cout << endl << endl;
cout << "The formatted name is: " << "Mr." << name[0] << ".";
for(i=0;i<name.size();i++){
if(name[i]==' '){
sp=i;
for(j=sp+1;j<=sp+1;j++){
temp=name[j];
cout << temp << ".";
}
}
}
for(i=sp+2;i<name.size();i++){
cout << name[i];
}
cout << endl;
}
};
int main(){
myclass c;
c.work();
}
Надеюсь, это поможет :) Вероятно, это более простая версия (изначально я написал это на C, вы можете легко преобразовать ее в C++, хотя логика остается прежней). Я принял имя, а затем вставил пробел в начале строки и еще одно место в конце, перед символом NULL ('\ 0')
Программа проверяет пробел. Когда он встречает один, он проверяет следующее пространство, которое встречается в строке. Теперь появление этого пространства помогает нам определить важный определяющий фактор в отношении того, каким должно быть следующее действие.
См., Если после этого последующего пробела есть нулевой символ, тогда мы можем заключить, что последующее пространство было тем, которое мы вставили в конце строки. То есть пространство, которое происходит после первичного пространства, которое произошло до фамилии. Бинго! Вы получаете точный индекс массива, откуда начинается фамилия! : D
Выглядит долго, но на самом деле просто. Удачи!
#include<stdio.h>
#include<string.h>
void main()
{
char str[100]; /*you could also allocate dynamically as per your convenience*/
int i,j,k;
printf("Enter the full name: ");
gets(str);
int l=strlen(str);
for(i=l;i>=0;i--)
{
str[i+1]=str[i]; //shifting elements to make room for the space
}
str[0]=' '; //inserting space in the beginning
str[l+1]=' '; str[l+2]='\0'; //inserting space at the end
printf("The abbreviated form is:\n");
for(i=0;i<l+1;i++) //main loop for checking
{
if(str[i]==' ') //first space checker
{
for(j=i+1; str[j]!=' ';j++) //running loop till subsequent space
{
}
if(str[j+1]!='\0') //not the space after surname
{
printf("%c.",str[i+1]); //prints just the initial
}
else
for(k=i+1;str[k]!='\0';k++) //space after surname
{
printf("%c", str[k]); //prints the entire surname
}
}
}
}
Я думаю, что самый простой способ решить эту проблему - это сделать токенизацию вашей строки, напечатать первый символ из нее, за исключением последней, где вы печатаете свой полный размер.
Чтобы tokenize, вы можете сделать что-то вроде этого:
std::vector<std::string> tokenize(std::istringstream &str)
{
std::vector<std::string> tokens;
while ( !str.eof() ) {
std::string tmp;
str >> tmp;
tokens.push_back(tmp);
}
return tokens;
}
Теперь вы можете легко перенести маркеры:
int main()
{
std::string name;
cout << "Enter the name of the male student: ";
getline(cin,name);
cout << endl;
cout << "The original name is: ";
cout << name;
cout << endl << endl;
std::istringstream str(name);
std::vector<std::string> tokens = tokenize(str);
for ( int i = 0 ; i < tokens.size() - 1; ++i)
std::cout << tokens[i][0] << ". ";
cout << tokens[tokens.size() - 1] << endl;
}
Я думаю, на ваш вопрос уже был дан ответ. Но в будущем вы можете рассмотреть возможность разделения вашей программы на более простые задачи, что упрощает чтение. В сочетании с описательными именами переменных и функций он может облегчить понимание программы и, следовательно, позднее ее изменить или исправить. Отказ от ответственности - я начинающий любительский программист, и это только идеи:
#include <iostream>
#include <iterator>
#include <sstream>
#include <vector>
// I got this function from StackOverflow somewhere, splits a string into
// vector of desired type:
template<typename T>
std::vector<T> LineSplit(const std::string& line) {
std::istringstream is(line);
return std::vector<T>(std::istream_iterator<T>(is), std::istream_iterator<T>());
}
class Names {
private:
std::vector<std::string> full_name_;
void TakeInput() {
std::cout << "Enter the name of the male student: " << std::endl;
std::string input;
getline(std::cin,input);
full_name_ = LineSplit<std::string>(input);
}
void DisplayInitialsOfFirstNames() const {
std::cout << "Mr. ";
for (std::size_t i = 0; i < full_name_.size()-1; ++i) {
std::cout << full_name_[i][0] << ". ";
}
};
void DisplayLastName() const {
std::cout << full_name_.back() << std::endl;
}
public:
void work() {
TakeInput();
DisplayInitialsOfFirstNames();
DisplayLastName();
};
};
int main(){
Names n;
n.work();
}
Попробуйте ответить ravi, чтобы заставить ваш код работать, но я хотел бы указать, что есть более интуитивные способы программирования этого, что облегчит обслуживание и сотрудничество в будущем (всегда хорошая практика).
Вы можете использовать реализацию explode() (или C strtok()) для разделения строки имени на куски. Затем просто используйте первый символ каждой части, не считаясь с фамилией.
Измените свой цикл на:
for(i=0;i<name.size();i++)
{
if(name[i]==' ')
{
initial = i + 1; //initial is of type int.
temp = name[initial]; //temp is char.
cout << temp << ".";
}
}