Работа со строками. Исключение символов из строки - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дана непустая последовательность слов (не более 50), в каждом слове не более 20 символов. Слова разделены пробелом, за последним словом точка. Исключить из каждого слова все символы, не являющиеся буквами.
Видимо, это начало.. а вот как дальше... #include #include #include void main() { int i,b,n,p,z; char A[50][9], X[50][9],k; printf("введи последовательность слов\n"); k='1'; for(n=0;(k!='.');n++) {scanf("%[^ .]",&A[n]); k=getchar();}
Все еще в силе. Срочный хелп.

Решение задачи: «Работа со строками. Исключение символов из строки»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
 
#define SIZELINE 1000
 
int main(void)
{
    char *line = NULL;
    char *new_line = NULL;
    char *p = NULL;
    int c, i;
    bool state;
    
    if ((line = (char*)malloc(SIZELINE * sizeof(char))) == NULL) {
    fprintf(stderr, "Err: Couldn't allocated memory.\n");
    exit(EXIT_FAILURE);
    }
    if ((new_line = (char*)malloc(SIZELINE * sizeof(char))) == NULL) {
    fprintf(stderr, "Err: Couldn't allocated memory.\n");
    exit(EXIT_FAILURE);
    }
    
    i = 0;
    while ((c = getchar()) != EOF && c != '.')
    line[i++] = c;
    line[i++] = ' ';
    line[i++] = '\n';
    line[i] = '\0';
    
    /* Parse */
    p = strtok(line, " ");
    do {
    if (*p) {
        state = true;
        i = 0;
        while (p[i]) {
        if (!isalpha(p[i])) {
            state = false;
            break;
        }
        ++i;
        }
        if (state) {
        strcat(new_line, p);
        strcat(new_line, " ");
        }
    }
    p = strtok('\0', " ");
    } while (p);
    
    new_line[strlen(new_line)-1] = '.';
    strcat(new_line, "\n");
    printf(new_line);
    
    free(new_line);
    free(line);
    p = NULL;
    
    return 0;
}

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

  1. Включаем необходимые заголовочные файлы для работы со строками, памятью и т.д.
  2. Определяем константу SIZELINE размером в 1000 символов.
  3. В функции main() инициализируем строки line и new_line как NULL, а также объявляем переменные c, i, state и p.
  4. Выделяем память под строку line с помощью malloc() и проверяем успешность операции, иначе выводим сообщение об ошибке и завершаем программу.
  5. Выделяем память под строку new_line с помощью malloc() и проверяем успешность операции, иначе выводим сообщение об ошибке и завершаем программу.
  6. Инициализируем переменную i = 0.
  7. Считываем данные из стандартного ввода в строку line до тех пор, пока не встретим символ '.' или EOF.
  8. Добавляем символ пробела и символа новой строки в конец строки line.
  9. Инициализируем переменную state = true.
  10. Инициализируем переменную i = 0.
  11. В цикле while считываем каждый символ из строки line и проверяем его на наличие в строке abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.
  12. Если символ является буквой, то продолжаем цикл, иначе прерываем цикл и устанавливаем значение state = false.
  13. Если значение state = true после цикла, то добавляем текущий символ в строку new_line.
  14. Добавляем символ пробела в конец строки new_line.
  15. Повторяем шаги 10-14 для всех считанных символов.
  16. Добавляем символ новой строки и символ точки в конец строки new_line.
  17. Выводим содержимое строки new_line.
  18. Освобождаем память, выделенную под строки line и new_line.
  19. Освобождаем память, выделенную под указатель p.
  20. Возвращаем 0, что означает успешное завершение программы.

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

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