Работа со строками. Исключение символов из строки - 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; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы со строками, памятью и т.д.
- Определяем константу SIZELINE размером в 1000 символов.
- В функции main() инициализируем строки line и new_line как NULL, а также объявляем переменные c, i, state и p.
- Выделяем память под строку line с помощью malloc() и проверяем успешность операции, иначе выводим сообщение об ошибке и завершаем программу.
- Выделяем память под строку new_line с помощью malloc() и проверяем успешность операции, иначе выводим сообщение об ошибке и завершаем программу.
- Инициализируем переменную i = 0.
- Считываем данные из стандартного ввода в строку line до тех пор, пока не встретим символ '.' или EOF.
- Добавляем символ пробела и символа новой строки в конец строки line.
- Инициализируем переменную state = true.
- Инициализируем переменную i = 0.
- В цикле while считываем каждый символ из строки line и проверяем его на наличие в строке
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
. - Если символ является буквой, то продолжаем цикл, иначе прерываем цикл и устанавливаем значение state = false.
- Если значение state = true после цикла, то добавляем текущий символ в строку new_line.
- Добавляем символ пробела в конец строки new_line.
- Повторяем шаги 10-14 для всех считанных символов.
- Добавляем символ новой строки и символ точки в конец строки new_line.
- Выводим содержимое строки new_line.
- Освобождаем память, выделенную под строки line и new_line.
- Освобождаем память, выделенную под указатель p.
- Возвращаем 0, что означает успешное завершение программы.