Что не так в этом коде изменения длины строки? - C (СИ)
Формулировка задачи:
Дана строка текста, в которой нет начальных и конечных пробелов.
Необходимо изменить ее так, что бы длина строки стала равна
заданной длине (не меньше исходной). Это следует сделать путем
вставки между словами дополнительных пробелов. Количество
пробелов между отдельными словами должно отличаться не более
чем на 1
#include <windows.h> #include <stdio.h> #include <string.h> int string(char[]) { for (int i = 0; i < n; i++)/*ищем пробелы*/ { if (st[i] == ' ')/*если символ " "*/ k++;/*кол-вопробелов +1*/ } for (int i = 0; i < n; i++) { if (k == 0)/*если пробелов нет*/ } } else ;{ int nnew(char[]) { for (int i = 0; i < n; i++)//формируем и выводим новую строку по-символьно { if (st[i] == ' ') } for (int j = 0; j < kplus; j++)//добавляем "обязательные" пробелы { if (ost > 0)//добавляем "оставшиеся" пробелы ost-- ; } } } void main() { char s[80]; int n; printf("Введите cтроку!\n"); skanf("%s", s); int n = st.Length, k = 0;//длина строки и кол-во пробелов в ней printf("Ошибка! в строке нет пробелов.\n"); skanf("%s", s); printf("Задайте новую длину строку(не меньше исходной, исходная длина " + n + "):\n"); skanf("%s", s); int kplus = (nnew - n) / k;//кол-во пробелов, которое необходимо добавить между всеми словома int ost = (nnew - n) % k;//кол-во пар слов, между которыми нужно доавить еще 1 пробел system("pause"); }
Решение задачи: «Что не так в этом коде изменения длины строки?»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #define N 80 int main() { char str[N], *p, *f; int size, i = 0, j, count = 0, diff, len = 0, remainder, x; puts("Enter line:"); fgets(str, N, stdin); printf("Enter length new string no less %d:\n", N); while(1 != scanf("%d", &size) || size < N){ puts("Incorrect data entry!Try again."); while(getchar() != '\n'); } p = malloc(size * sizeof*p); if(!p){ puts("Memory allocation error!"); exit(1); } while(str[i]){ if(str[i++] == ' ') count++; len++; } diff = size - len; x = diff / count; remainder = diff % count; f = p; for(i = 0; str[i]; i++){ *f++ = str[i]; if(str[i] == ' '){ for(j = 0; j < x; j++) *f++ = ' '; if(remainder--){ *f++ = ' '; } } } *f = '\0'; puts(p); free(p); return 0; }
Объяснение кода листинга программы
- Ввод строки с помощью функции
fgets()
. - Запрос на ввод длины новой строки с помощью функции
scanf()
. - Проверка корректности ввода длины новой строки.
- Выделение памяти под новую строку с помощью функции
malloc()
. - Проверка успешности выделения памяти.
- Проход по исходной строке и подсчет количества пробелов.
- Вычисление разницы между длиной новой строки и фактической длиной строки после удаления пробелов.
- Вычисление количества пробелов, которые нужно добавить, чтобы получить новую длину строки.
- Проход по исходной строке с учетом пробелов и добавление символов в новую строку.
- Добавление дополнительных пробелов, если есть недостача.
- Добавление символа
NULL
в конец новой строки. - Вывод новой строки с помощью функции
puts()
. - Освобождение памяти с помощью функции
free()
. - Возврат значения 0, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д