Как разделить строку пополам без использования указателей - PullRequest
1 голос
/ 16 октября 2019

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

Я попытался создать цикл for, который начинается в середине user_input и должен помещать каждую букву в строку «right».

int main() {

    char user_input[STRING_LENGTH] = { 0 };
    char left[STRING_LENGTH];
    char right[STRING_LENGTH];

    int lenght, mid, i;

    printf("Please type in a string: ");

    fgets(user_input, STRING_LENGTH, stdin);
    user_input[strlen(user_input) - 1] = 0;

    lenght = strlen(user_input);
    mid = lenght/2;
    for (i = 0; i < mid; ++i) {
        left[i] = user_input[i];
    }

    for (i = lenght; i < mid; --i) {
        right[i] = user_input[i];
    }
}

Ожидаемый результат, есливвод «самолет» будет «воздух - полоса».

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Рассмотрим эту часть:

for (i = lenght; i < mid; --i) {
    right[i] = user_input[i];
}

Каким будет содержимое right[0] в этом случае? Вы копируете правую часть строки, но не в то место. Попробуйте вместо этого:

for (i = mid; i < lenght; i++) {
    right[i-mid] = user_input[i];
}

Кроме того, вы должны завершить эти массивы нулем. В целом это должно выглядеть так:

for (i = 0; i < mid; ++i) {
    left[i] = user_input[i];
}
left[mid] = '\0';
for (i = mid; i < lenght; i++) {
    right[i-mid] = user_input[i];
}
right[i-mid] = '\0';
printf("%s-%s", left, right);
2 голосов
/ 16 октября 2019

У вас есть проблема в вашем последнем for, которая никогда не выполнит его тело, потому что вы начинаете с lenght до mid, но тестируете, пока оно меньше mid, чтоникогда не верно.

Измените его на:

for (i = lenght; i >= mid; --i)

... и убедитесь, что вы включили mid, иначе средний символ не будет отображаться.

Также обратите внимание, что вам не нужно считать в обратном порядке в этом цикле, что является причиной ошибки. Вы можете сделать:

for (i = mid; i < lenght; i++) 

Наконец, как заметил @Blaze в своем ответе , вы должны заполнить right с правильным смещением на , вычитая mid из индекса i:

right[i-mid] = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...