Сформировать из строки с ФИО строку с фамилией с инициалами (C-строки) - C (СИ)
Формулировка задачи:
Написать программу, формирующую из одной строки, содержащей фамилию, имя
и отчество строку с фамилией и инициалами.
Решить задачу через С строки.
Вот моя программа. Только перед инициалом имени она выводит лишние символы. Как исправить?
P.S. консоль спросит номер задачи. Введите 1
#include <iostream>
#include <windows.h>
#include <string>
#include <stdio.h>
#include <ctype.h>
#include <locale>
#include <fstream>
using namespace std;
void zamena (char* a, char* a1)
{
char* space = strchr (a, ' ');
int t = space - a + 1;
strncpy (a1, a, t);
char a2 [4];
a2[0]=a[t];
a2[1]='.';
a2[2]=' ';
strcat (a1, a2);
char* space2 = strrchr (a, ' ');
t = space2 - a + 1;
a2[0]=a[t];
a2[1]='.';
strcat (a1, a2);
}
void zadacha1()
{
const int n=80;
char a[n];
cout << "Введите ФИО: ";
cin.ignore();
cin.getline(a, n);
char a1[n];
zamena (a, a1);
cout << a1;
}
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int m;
cout << "Введите номер задачи: ";
cin >> m;
switch (m)
{
case 1: zadacha1(); break;
}
return 0;
}Решение задачи: «Сформировать из строки с ФИО строку с фамилией с инициалами (C-строки)»
textual
Листинг программы
#include <stdio.h>
void copy_fio(const char* src, char* dst) {
int stage = 0;
char ch;
while (ch = *src++) {
if (stage == 0) {
if (ch == ' ') {
stage = 1;
}
*dst++ = ch;
continue;
}
if (stage == 1) {
if (ch != ' ') {
stage = 2;
*dst++ = ch;
}
continue;
}
if (stage == 2) {
stage = 3;
*dst++ = '.';
continue;
}
if (ch == ' ') {
stage = 1;
*dst++ = ' ';
}
}
*dst = '\0';
}
int main(void) {
char src[] = "Ivanov Ivan Ivanovich";
char dst[sizeof(src) / sizeof(src[0])];
copy_fio(src, dst);
puts(dst);
return 0;
}
Объяснение кода листинга программы
- В функции
copy_fioпроисходит копирование строкиsrcв строкуdst. - Переменная
stageиспользуется для отслеживания текущего этапа формирования строки с фамилией и инициалами. - Если
stageравно 0 и встречается пробел, тоstageизменяется на 1. - Если
stageравно 1 и встречается символ, который не является пробелом, тоstageизменяется на 2. - Если
stageравно 2 и встречается пробел, тоstageизменяется на 1. - Если
stageравно 2 и встречается символ, который не является пробелом, то добавляется этот символ вdst. - Если
stageравно 3 и встречается пробел, тоstageизменяется на 1. - Если
stageравно 3 и не встречается пробел, то добавляется точка вdst. - Если
stageравно 1 и встречается пробел, тоstageизменяется на 1. - Если
stageравно 1 и не встречается пробел, то добавляется символ изsrcвdst. - Если
stageравно 0 и не встречается пробел, то добавляется символ изsrcвdst. - В конце функции добавляется нулевой символ в
dst. - В функции
mainсоздается строкаsrcсодержащая ФИО. - В функции
mainсоздается пустая строкаdstдля хранения фамилии и инициалов. - В функции
mainвызывается функцияcopy_fioдля копирования строкиsrcв строкуdst. - В функции
mainвыводится содержимое строкиdstс помощью функцииputs. - В функции
mainвозвращается 0, что означает успешное выполнение программы. - В функции
mainне указаны какие-либо комментарии. - В функции
mainне используются переменныеstage,srcиdst. - В функции
mainне используются функцииcopy_fioиputs.