Модификация строки в функции C - PullRequest
0 голосов
/ 20 марта 2019

Допустим, я хочу изменить массив символов с помощью функции.Я всегда вижу людей, использующих malloc, calloc или указатели для изменения int, char или 2D-массивов.Прав ли я, если я скажу, что строку можно вернуть из функции, только если я использую malloc, создаю указатель этого массива и возвращаю его?Тогда почему бы не получить / изменить строку, передав ее в параметр функции?Разве моя демонстрация, которая использует массив char в параметре проще, чем выделение / освобождение?Моя концепция неверна, или почему я никогда не вижу, чтобы люди передавали массивы для работы?Я вижу только коды с передачей вроде «char * array», а не «char array []», используя malloc и т. Д., Когда я вижу этот метод простого изменения массива char.Я что-то упустил?

#include <stdio.h>

void change(char array[]){
    array[0]='K';
}

int main(){

    char array[]="HEY";
    printf("%s\n", array);
    change(array);
    printf("%s\n",array );

    return 0;
}

1 Ответ

3 голосов
/ 20 марта 2019

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

  • Что если вы хотите получить измененную строку, но также хотите сохранить оригинал? Чтобы избежать уничтожения оригинала произвольного размера, вам нужно malloc пробел, сделать копию и изменить ее.

  • А что, если вы хотите расширить строку? Если ваше изменение заключается в добавлении «YOU» в строку, он не может изменить оригинал, потому что для него нет места - это вызовет переполнение буфера , поскольку для него выделено только 4 байта » ЭЙ "(три буквы плюс нулевой терминатор). Опять же, решение включает в себя malloc пространство для работы.

Функции, которые вносят изменения с использованием вашей техники, обычно нуждаются в параметре size или length, чтобы избежать переполнения массива и вызвать сбой и потенциальную угрозу безопасности. Но хотя это позволяет избежать переполнения, остается вопрос о том, что произойдет, если недостаточно места: молча отбросить некоторые данные? Передать обратно флаг или специальное значение, чтобы указать, что не было достаточно места, и ожидать, что вызывающий обработает это? В конце концов, в итоге легче написать это правильно с первого раза, и malloc / calloc пространство и иметь дело с необходимостью освободить его позже и все такое.

...