Сформировать из строки с ФИО строку с фамилией с инициалами (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;
}

Объяснение кода листинга программы

  1. В функции copy_fio происходит копирование строки src в строку dst.
  2. Переменная stage используется для отслеживания текущего этапа формирования строки с фамилией и инициалами.
  3. Если stage равно 0 и встречается пробел, то stage изменяется на 1.
  4. Если stage равно 1 и встречается символ, который не является пробелом, то stage изменяется на 2.
  5. Если stage равно 2 и встречается пробел, то stage изменяется на 1.
  6. Если stage равно 2 и встречается символ, который не является пробелом, то добавляется этот символ в dst.
  7. Если stage равно 3 и встречается пробел, то stage изменяется на 1.
  8. Если stage равно 3 и не встречается пробел, то добавляется точка в dst.
  9. Если stage равно 1 и встречается пробел, то stage изменяется на 1.
  10. Если stage равно 1 и не встречается пробел, то добавляется символ из src в dst.
  11. Если stage равно 0 и не встречается пробел, то добавляется символ из src в dst.
  12. В конце функции добавляется нулевой символ в dst.
  13. В функции main создается строка src содержащая ФИО.
  14. В функции main создается пустая строка dst для хранения фамилии и инициалов.
  15. В функции main вызывается функция copy_fio для копирования строки src в строку dst.
  16. В функции main выводится содержимое строки dst с помощью функции puts.
  17. В функции main возвращается 0, что означает успешное выполнение программы.
  18. В функции main не указаны какие-либо комментарии.
  19. В функции main не используются переменные stage, src и dst.
  20. В функции main не используются функции copy_fio и puts.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы