Не могу изменить массив в цикле (C) - PullRequest
0 голосов
/ 17 сентября 2018

В настоящее время я занимаюсь разработкой небольшой программы, для которой требуется функция, которая возвращает строку (массив символов), и два параметра (фраза, с).«Фраза» - это строковый ввод, а «с» - символ, который будет удален из фразы.Остатки также будут удалены.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//This method has two parameters: (str, c)
//It will remove all occurences of var 'c'
//inside of 'str'
char * rmchr(char * str, char *c) {
    //Declare result array
    char *strVal = (char *) malloc(sizeof(char) * strlen(str));

    //Iterate through each character
    for (int i = 0; i < strlen(str); i++) {
            *(strVal+i) = str[i];
        //Check if char matches 'c'
        if (strVal[i] != *c){
            //Assign filtered value to new array
            *(strVal+i) = str[i];
            printf("%c", strVal[i]);
        }
    }
    return strVal;
}

int main()
{
    char * result = rmchr("This is a great message to test with! It includes a lot of examples!","i");
    return 1;
}

Внутри функции 'rmchr' (оператор if) массив выводит именно то, что я хотел бы вернуть:

Ths s a great message to test wth! It ncludes a lot of examples!

Проблема в том, что мойвозвращаемая переменная, strVal не изменяется вне оператора if.Как я могу навсегда изменить массив, чтобы мой идеальный вывод был возвращен внутри «результата» (внутри основного).

1 Ответ

0 голосов
/ 17 сентября 2018

Я вижу несколько моментов для решения.Прежде всего, этот код напрямую копирует входную строку дословно.Такое же присвоение *(strVal+i) = str[i]; происходит в двух местах кода, что не учитывает сравнение с *c.Без какой-либо вторичной индексной переменной j становится трудно отслеживать конец получаемой строки.

Дополнительные примечания:

  • Нет freeдля вашего malloc;это создает утечку памяти.

  • Вы возвращаете код выхода 1, который указывает на аварийное завершение программы.return 0 для обозначения нормального выхода.

  • Не приводить указатель malloc return;это может скрывать ошибки.

  • Подтвердить malloc success и завершить работу в случае неудачи.

  • strlen() - это линейная операция времени, которая повторяетсячерез всю строку параметров при каждом вызове.Вызовите его один раз и сохраните результат в переменной для сохранения циклов.

  • Этот код не обрабатывает удаление лишних пробелов, как требуется.

См. Пример ниже для возможной реализации, которая обращается к некоторым из указанных выше пунктов:

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

char *rmchr(char *str, char *c) {
    int i = 0;
    int j = 0;
    int len = strlen(str);
    char *result = malloc(sizeof(*result) * (len + 1));

    if (result == NULL) {
        fprintf(stderr, "out of memory\n");
        exit(1);
    }

    while (i < len) {
        if (str[i] != *c) {
            result[j++] = str[i++];
        }
        else {
            for (i++; i < len && str[i] == ' '; i++);
        }
    }

    result[j] = '\0';
    return result;
}

int main() {
    char *result = rmchr("This is a great message to test with! It includes a lot of examples!", "i");

    for (int i = 0; i < strlen(result); i++) {
        printf("%c", result[i]);
    }

    free(result);
    return 0;
}

Вывод:

Ths s a great message to test wth! It ncludes a lot of examples! 

И repl .

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