добавить пробел после пробела в массиве символов - PullRequest
0 голосов
/ 01 мая 2020

Итак, мне нужно вставить пробел после пробела в строке символов, например:


у нас есть строка: hello world, и функция должна возвращать hello world

hello world something else => hello world something else

hello world => hello world (4 пробела) (не обязательно, но предпочтительно)

как ?? (обязательно нужно использовать строку символов)


мое решение (оно не работает правильно, потому что вставляет только 1 пробел)

из hello world something возвращает hello world something:

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

using namespace std;

char* addSpaces(char* str) {
    char* p = strchr(str, ' ');

    if (p) {
        p++;
        int n = strlen(p);
        p[n + 1] = 0;
        while (n) {
            p[n] = p[n - 1];
            n--;
        }
        *p = ' ';
    }

    return str;
}

int main(void) {

    const int stringCount = 1;
    const int c = 500;

    char cstring[stringCount][c];
    string str[stringCount];

    for (int i = 0; i < stringCount; i++) {
        cout << "Enter " << i + 1 << ". line: ";
        cin.getline(cstring[i], c);
        str[i] = cstring[i];
    }

    for (int i = 0; i < stringCount; i++) {
        cout << "First function result with char in parameter: ";
        char* result = addSpaces(cstring[i]);
        cout << result << endl;
    }

}

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Использование Dynami c Массив:

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

using namespace std;

char *add(char *arr, int lastIndex, char key)
{
    int len = sizeof(&arr);
    if (len == 0 || arr[len - 1] != '\0')
    {
        char newArr[len + 100];
        newArr[len + 100 - 1] = '\0';
        strncpy(newArr, arr, len);
        *arr = *newArr;
    }
    arr[lastIndex] = key;
    return arr;
}

int main(void)
{
    std::string line;
    const int stringCount = 1;
    const int c = 500;
    cout << "Enter line: ";
    std::getline(std::cin, line);
    int spaceCount = 0;
    char cstring[0];
    int lastUpdated = 0;
    for (int i = 0; i < sizeof(line); i++)
    {
        add(cstring, lastUpdated++, line[i]);
        if (line[i] == ' ')
        {
            add(cstring, lastUpdated++, ' ');
        }
    }
    cout << cstring << endl;
}

ИЛИ Сначала проверьте пробел и начните char str с len+spaces. и добавьте дополнительное место on each iterate. Иначе может произойти ошибка, выходящая за пределы индекса.

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

using namespace std;
int main(void)
{
    std::string line;
    const int stringCount = 1;
    const int c = 500;
    cout << "Enter line: ";
    std::getline(std::cin, line);
    cout << line << endl;
    int spaceCount = 0;
    for (int i = 0; i < sizeof(line); i++)
    {
        if (line[i] == ' ')
        {
            spaceCount += 1;
        }
    }
    char cstring[stringCount + spaceCount];
    int j = 0;
    for (int i = 0; i < sizeof(line); i++)
    {
        if (line[i] == ' ')
        {
            cstring[j++] = ' ';
            cstring[j++] = ' ';
        }
        else
        {
            cstring[j++] = line[i];
        }
    }
    cout << cstring << endl;
}
1 голос
/ 01 мая 2020

Измените функцию main() в соответствии с вашими потребностями:

#include <iostream>
#include <cstring>
#include <cstdlib>

#define MAXLEN 500

void add_space(char* str, size_t index, size_t n) {
    if (n >= MAXLEN) {
        std::cerr << "Cannot further expand the array!" << std::endl;
        abort();
    }
    for (auto i = n; i >= index; --i)
        str[i] = str[i - 1];
    str[index] = ' ';
}

char* double_spaces(char* str, size_t n) {
    for (size_t i = 0; i < n; ++i)
        if (str[i] == ' ')
            add_space(str, i++, n++);
    return str;
}

int main() {
    char str[MAXLEN] = "hello  world";
    std::cout << double_spaces(str, std::strlen(str)) << std::endl;
    return 0;
}

Пример вывода:

For str[] = "hello world" function returns "hello  world"
For str[] = "hello world something else" function returns "hello  world  something  else"
For str[] = "hello  world" function returns "hello    world"

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

Анализ: Операция вставки требует времени O (n-index), которое можно уменьшить с помощью что-то похожее на ArrayLists.

...