Заменить один символ несколькими символами - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно заменить " " (пробел) на ", " (запятая и пробел). У меня есть функция, которая получает строку как char * и после замены всех этих символов печатает строку на экране.

char* PrintComma(char* Text) {
  for (int i = 0; i < strlen(Text); i++) {
    if (Text[i] == ' ') {
        Text[i] = ',';
    }
  }
  return Text;
}

Это заменяет " " на ",", но мне нужно ", ". Я не могу использовать вторую строку или массив для сохранения временных данных. Я могу использовать только эту строку.

Пример:

Input => "Hello world my name is"
Output => "Hello, world, my, name, is"

Ответы [ 4 ]

0 голосов
/ 31 марта 2020

У вас есть два требования:
1) Пробелы необходимо заменить.
2) Вы не можете использовать другой массив символов.

Это приводит к предположению, что для входного символа * должно быть выделено достаточно места для всех новых , с.

В этом случае это будет работать.

char *PrintComma(char *Text) {
  int numberOfSpaces = 0, orignalLength = strlen(Text);
  for (int i = 0; i < strlen(Text); i++) {
    if (Text[i] == ' ')
      numberOfSpaces++;
  }
  for (int i = orignalLength - 1, j = orignalLength + numberOfSpaces - 1; i >= 0; i--) {
    Text[j] = Text[i];
    j--;
    if (Text[i] == ' ') {
      Text[j] = ',';
      j--;
    }
  }
  return Text;
}
0 голосов
/ 31 марта 2020

Вот рабочий пример. Входной буфер должен быть достаточно большим, чтобы хранить замененную строку, поскольку требования гласят, что новая строка не должна создаваться.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void PrintComma(char* Text)
{
  char* str = Text;
  size_t c, len = strlen(Text);
  for (c = 0; Text[c]; Text[c] == ' ' ? c++ : *Text++);

  for (size_t i = 0; i < len + c; i++)
  {
    if (str[i] == ' ')
    {
        str[i] = ',';
        char last = ' ';
        for(size_t u = i + 1; u < len + c; u++)
        {
            char current = str[u];
            str[u] = last;
            last = current;
        }

        i += 2;
    }
  }
}

int main(void)
{
  char tmp[100] = { 0 };
  const char* TEST = "Hello world my name is";
  memcpy(tmp, TEST, strlen(TEST));

  printf("Input: %s\n", tmp);
  PrintComma(tmp);
  printf("Output: %s\n", tmp);

  return 0;
}

Результат:

Input: Hello world my name is
Output: Hello, world, my, name, is
0 голосов
/ 31 марта 2020

Исходя из ваших требований:

У меня есть функция, которая получает строку как char* и после замены всех этих символов печатает строку на экране.

Я не Я думаю, что вы хотите заменить пробел на запятую. Вместо этого я думаю, что вы хотите go через строку и напечатать все символы. Когда вы сталкиваетесь с пробелом, вы печатаете лишнюю запятую. Вот примерно как это сделать:

void PrintComma(char *text)
{
    const size_t len = strlen(text); // don't call on every iteration

    for(size_t i = 0; i < len; i++)
    {
        if(text[i] == ' ')
            putchar(',');

        putchar(text[i]);
    }
}
0 голосов
/ 31 марта 2020

Эта проблема кажется идеальной настройкой для memmove (), которая является библиотечной функцией, которая копирует байты между двумя строками, но обрабатывает перекрывающиеся блоки памяти.

memmove(
    char_pointer + make_room_at + room_to_make,
    char_pointer + make_room_at,
    init_size - make_room_at + room_to_make
);

Вот приложение, использующее memmove ().

char* PrintComma(char* Text) {
  for (int i = 0; i < strlen(Text); i++) {
    if (Text[i] == ' ') {
      memmove(
          Text + i + 1,
          Text + i,
          strlen(Text) - i + 1
      );
      Text[i++] = ',';
    }
  }
  return Text;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...