Я хочу написать небольшую программу на языке C, которая запрашивает у пользователя номер ввода length_input
, а затем печатает первые символы length_input
некоторой фиксированной строки string_input
.Как вернуть массив неизвестного размера в C
Теперь этот код не работает. Он компилируется отлично, но он всегда печатает пустую строку вместо "AB"
, например.
#include <stdio.h>
#include <stdlib.h>
char* take (char* string, int length) {
char* local_string = malloc(length);
for (int i = 0; i < length; i++) {
local_string[i] = string[i];
}
return local_string;
}
int main (int arg, char** args) {
char* string_input;
char* string_output;
int length_input;
printf("> ");
scanf("%s", &length_input);
string_input = "ABCDEFG";
string_output = malloc(length_input);
string_output = take(string_input, length_input);
printf(string_output);
printf("\n");
return 0;
}
Я предполагаю, что это потому, что я возвращаю локальную переменную в take
, нет? Я также прочитал, что объявление указателя local_string
в качестве статической переменной поможет. Я понимаю, что его распределенный размер затем должен быть известен во время компиляции, что сделает программу бессмысленной.
Дело в том,: Вызов take
должно не изменить какие-либо локальные переменные main
процедуры, или быть более точным: Это должно изменить ничего, что определяется с помощью main
процедуры - будь то в стеке или в куче. Поэтому мне нужно вернуть новый указатель на новый адрес в куче, а не изменять значения в существующем. (Почему? Это эксперимент.)
Можно ли делать то, что я хочу? Если да, то как?
Это 'scanf ("% s ", & length_input);' должен заставить компилятор вас предупредить. Будьте осторожны. – alk
@alk Но я не получил предупреждения? Я скомпилировал с помощью 'gcc -o output program.c', используя' gcc (Debian 5.2.1-23) 5.2.1 20151028'. Нет предупреждений. –
Ваша функция 'take' не завершает нуль строки. выделите 'length + 1' bytes и сделайте' local_string [length] = '\ 0'' –