Убрать лишние пробелы в последовательности - C (СИ)

  1. Есть последовательность символов. убрать все лишние пробелы, тоесть из нескольких пробелов ,что стоят подряд, оставить только один


textual

Код к задаче: «Убрать лишние пробелы в последовательности - C (СИ)»

#include <stdio.h>
 
char* Pack(char text[]) {
    char* ptr = text;
    unsigned offs = 0;
    unsigned space = 0;
 
    for (; *ptr; ++ptr) {
        if (*ptr == ' ') {
            space++;
        }
        else {
            if (space) {
                offs += space - 1;
                space = 0;
            }
        }
        *(ptr - offs) = *ptr;
    }
    *(ptr - offs) = 0;
 
    return text;
}
 
int main() {
 
    char text[] = "Hello    World!    I    Am   Student    !";
 
    printf("%s\n", Pack(text));
 
    return 0;
}

СДЕЛАЙТЕ РЕПОСТ

15   голосов, оценка 3.667 из 5



Похожие ответы
  1. Дана строка предложение. Удалить из строки все лишние пробелы: в начале, в конце, повторяющиеся. Не могу понять, как удалить все пробелы в начале и в конце. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include   #include   int main(int argc, char *argv[]) { setlocale(LC_ALL,""); char str[101]; printf ("Введите строку:"); gets(str);   int j=1;   for (int i=1; str[i]!=0; i++) {      if((str[i] == ' ') && (str[i-1]==' ')) continue;      str[j++] = str[i]; }     if (str[j-1]==' ') j--;   str[j] = 0;   printf("Результат:");  puts(str); }

  1. После каждой буквы предпоследнего слова вставить символ '*'. Лишние символы (с 81-ого) отбросить. Использовать string.h и указатели. Если честно, я без понятия, как это сделать, поэтому показывать мне нечего, ребят (разве что прототип функции).

  1. Добрый день. Необходима помощь, имеется текстовый файл, в котором содержится информация о том или ином продукте: название, стоимость, материал... Все это разбито в файле при помощи символа "|", чтение из файла производится "вроде как" правильно. Но при разбивании на отдельные части в программе после всего появляются лишние символы: яшки, середечки, и тому подобная диковина...C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 void ReadFromFile(char FileName[]) {     char str[500];     int strpos = 0;     char *buf;     FILE * f = fopen(FileName, "r");     if(!f) printf("File not found!"), exit(1), getch();     while((str[strpos] = getc(f)) != EOF)         {         printf("%c", str[strpos]);         strpos++;     }     for(buf = strtok(str, "|"); buf != NULL; buf = strtok(NULL, "|"))     {         printf("\n\n%s", buf);     }     fclose(f); }

  1. Здравствуйте. По заданию программа должна открывать файл на чтение, считывать информацию и закрывать файл. Реализовать всё нужно посредством прерываний.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include #include main() {     unsigned des;     char file_name[]="fil.f",          st[]="";     _DS=FP_SEG(file_name);     _DX=FP_OFF(file_name);     _AX=0x3D00;     geninterrupt(0x21);     des=_AX;     _BX=des;     _CX=5;     _DS=FP_SEG(st);     _DX=FP_OFF(st);     _AX=0x3F00;     geninterrupt(0x21);       _DS=FP_SEG(st);     _DX=FP_OFF(st);     _AX=0x0900;     geninterrupt(0x21);       _BX=des;     _AX=0x3E00;     geninterrupt(0x21);     getch(); }В файле одно слово KATAL. Почему-то при чтении из файла в строке получается не "KATAL", а "KATAL \x2\x1", которые при выводе на экран преображаются в два смайлика. Я так понимаю, что это какие-то служебные символы. При использовании printf() они не выводятся. Но реализовать надо через прерывание. Отсюда вопрос(ы): Я неправильно считываю, и можно как-то считать без этих символов? Или я неправильно вывожу, и можно как-то вывести без этих смволов? Или проблема в файле?

  1. Добрый день. Столкнулся с проблемой в программе. Пробелы удаляет, но если ввести пробелы перед строкой, то их не удалит. Полное задание: Написать функцию, которая позволяет в заданной строке удалить все лишние пробелы, заменяя несколько подряд идущих пробелов одним. Специфика состоит в том, что в задании нельзя использовать библиотечные функции обрабатывания строк. Ниже код моей программы:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include int prob(char s) {     int d;     d = 0; printf("Input your text:\n"); while ((s = getchar()) != EOF)     {         if (s == ' ')                   d++;         if (d <= 1 )                     putchar (s);         if (s != ' '&&d > 1)               putchar (s);         if (s != ' ')                   d=0;     }     printf("Press any key to exit..."); }C помощью еще одного цикла и метки смог избавится от проблемы, однако это только при первой вводе строки. При повторном вводе и если перед строкой пробелы - все равно один пробел остается.

  1. Как решить проблему я к сожалению не нашел в интернете. Суть в том, что в консоль при выводе float целое число, например 5, выводиться как 5,0000000 И числа такие как 5,25 выводятся 5,2500000 Как это решить? Код у меня такой:C++1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 float a,b,c,x; int x1,x2,dx,i;     float func(float aa, float bb, float cc, int xx) {     if (((aa*xx)==0)||(xx==0)||((cc-4)==0))     {         return -6000;     }     else     {         if ( ((xx+5<0) && (cc==0) ) || ( (xx+5>0) && (cc!=0)) )         {             if ((xx+5<0)&&(cc==0)) return ((1/aa*xx)-bb);             if ((xx+5>0)&&(cc!=0)) return ((xx-aa)/xx);         }         else         {             return ((10*xx)/(cc-4));         }     } }   void main() {      for (int i=x1;i<=x2;i=i+dx)      {     x=func(a,b,c,i);     if (x==-6000) printf("F(%i) = error\n", i); else printf("F(%i) = %f\n", i, x);       } }

  1. Здравствуйте. Написал функцию, которая разделяет строку по пробелам (или какому-либо другому символу) и сохраняет эти разделённые слова в элементах массива. Проблема заключается в том, что если указана строка "1 2 3 4", то в массив добавляются еще 8 (в итоге 12 элементов) элементов, содержащие непонятные символы. Если вывести содержимое этих элементов, то ломаются шрифты и приходится восстанавливать их с помощью tail /bin/ls (не знаю почему). Но если указать строку "1 2 3 4 5 6 7 8 9 10", то в итоге в массиве опять же 12 элементов, но при выводе их содержимого шрифты не ломаются. Не могу понять, где находится проблема, но может вы сможете? code.cC1 2 3 4 5 6 7 8 9 10 11 #include #include #include #include "explode.c" // explode()   int main() {     char *string = "1 2 3 4 5 6 7 8 9 10";     char *array[100];     explode(string, array, ' ');     print_array(array); }explode.c:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 void explode(char *string, char *array[], char symbol) {     char *ptr = string; // Указатель на строку     char *tmp = (char *) malloc(sizeof(char) * 256); // Текущее слово (слова разделены символом symbol)     int index = 0; // Индекс текущего элемента в массие array[]       while(*ptr != '\0') { // Читаем до конца строки           if(*ptr == symbol) { // Символ разделителя?               array[index] = (char *) malloc(sizeof(char) * strlen(tmp) + 1); // Выделяем элементу область памяти             strncpy(array[index], tmp, strlen(tmp)); // Копируем текущее слово в элемент массива             strncat(array[index], "\0", 1); // Добавляем нулевой байт               bzero(tmp, strlen(tmp)); // Заполняем tmp нулевыми байтами             index++; // Для следующего слова - следующий элемент массива                 } else {             strncat(tmp, ptr, 1); // Добавляем 1-ый символ ptr         }           ptr++;     }       // Последнее слово не добавлено в массив, так как в конце у нас нету символа symbol.     // (Он может быть поставлен пользователем вручную (в строке string), но это неэффективно,     // так как по задумке пользователь хотел добавить пустой элемент в массив, поэтому     // добавляем последнее слово вручную.)     array[index] = (char *) malloc(sizeof(char) * strlen(tmp) + 1); // Выделяем элементу область памяти     strncpy(array[index], tmp, strlen(tmp)); // Копируем текущее слово в элемент массива     strncat(array[index], "\0", 1); // Добавляем нулевой байт   }   /*  * Вывести содержимое элементов массива.  */ void print_array(char *array[]) {     int index; // Индекс текущего элемента     for(index = 0; array[index] != NULL; index++) {         printf("#%d: %s\n", index, array[index]); // Выводим индекс и содержимое элемента     } }Добавлено через 8 минут Если кратко, то проблема кроется в непонятных элементах массива.

  1. Из переменной buffer элементы строки записываются в двумерный массив, а после выводятся. Но при выводе получаются лишние символы, в данном случае половину предыдущей строки. Можете подсказать в чем проблема? Спасибо.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 file = fopen("c:\\1text.txt","r");     while (!feof(file))                         {               fgets (buffer, M, file);             printf("%s", buffer);             for (j = 0; j < M; j++)             {                 if(buffer[j]!='\n')                 ch[i][j] = buffer[j];                 else break;             }             i++;         }     fclose(file);Исходный файл:C1 2 3 4 5 1234 Once I caught a fish alive 45678910 Then I let it go again 11121331РезультатC1 2 3 4 5 1234 Once I caught a fish alive 45678910 Then I let it go again 11121331at it go againP.S. Как можно вывести массив ch построчно "%s" в консоль или в файл?

  1. это небольшой кусочек задачи. В начале задается массив, который заполняется произвольным текстом. Предполагается, что может быть поставлено много лишних пробелов перед словами. Нужно удалить лишние пробелы. Поправьте пожалуйста. C++1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include #include void udalenie (char *txt[10][50], int i, int t, int k) { int p; for (p=i;p