2015-10-15 2 views
-1

У меня возникли проблемы в C с возвращением строки из этой функции:Функция не может возвращать строковые

char setup(){ 

    puts("Please select a size for the string"); 
    scanf("%d", &size); 
    getchar(); 

    char sequence[size]; 

    printf("Please write any sequence of %d numbers\n", size); 
    fgets(sequence, size+1, stdin); 

return *sequence; 
} 

Размер устанавливается в качестве глобальной переменной. И главное:

int main(){ 

    int program=0; 
    char sequence_alt[size]; 

    puts("Please select the number of the program to test:"); 
    scanf("%d", &program); 
    getchar(); 

    switch(program){ 
    case 1: 
     sequence_alt[size]=setup(); 
     break; 

выключатель идет, но ничего не добавляется в этом случае. Вместо того, чтобы получить полную строку, например 12345, если я выбираю размер 5, я получаю только первый символ. Я искал множество руководств, но я все еще не могу понять, действительно ли проблема в моей функции, или моя основная, когда я печатаю значение последовательности. Любой совет и помощь были бы потрясающими, и я всегда был бы благодарен. Извините, если код слишком рудиментарный, но я все еще беру свои первые детские шаги при обучении C.

Спасибо!

+1

'char' означает один символ. Функция возвращает символ 'char'. –

ответ

1

Ваша функция должна возвращать char * (не один char)

char setup(){ 
    ... 
    return *sequence; 
} 

должен быть

char *setup(void){ 
    ... 
    return sequence; 
} 

char sequence[size]; 

sequence является локальным массивом, его срок службы заканчивается, когда функция , используйте динамическую память:

char *sequence = malloc(size); 

Использование size+1 в fgets вы можете написать за пределы массива, изменить

fgets(sequence, size+1, stdin); 

в

fgets(sequence, size, stdin); 
+0

Спасибо, это сработало отлично! Я понятия не имел, что char в функции возвращает только один символ, а не полную строку. Всегда учись! О размере + 1, если я не добавлю это, и у меня размер 5, например, 5-я позиция будет заменена нулевым символом, поэтому больно получить только место для 4 символов. Я думаю, что это неудача fgets. –

+0

Добро пожаловать, если вам нужно 5 символов, вам необходимо зарезервировать место для 6 (еще один для хвоста '\ 0') –

0

Как объяснено выше ответ, ваша функция должна возвращать символ *, чтобы вернуть строку (указатель указателя), и вы также должны знать, что все, что вы создаете в функциональном блоке, исчезает при повторной установке n из функции. поэтому последовательность может возвращать только первый символ, даже если он был char *, поскольку для строки такого размера не было выделено памяти. Следующие будут работать нормально

char* setup(){ 

    puts("Please select a size for the string"); 
    scanf("%d", &size); 
    getchar(); 

    char *sequence = malloc(sizeof(int) * size); 

    printf("Please write any sequence of %d numbers\n", size); 
    fgets(sequence, size+1, stdin); 

    return sequence; 
} 
+0

' sizeof (int) * size'? –

+0

Спасибо за помощь, она решила мою проблему! –

+0

sizeof (int) возвращает 4 байта, если 32-разрядная машина или что-то еще, но вам просто нужно количество «целых чисел», поэтому нам нужен размер * 4 байта (или любые байты представляют собой int на машине) – Lukas

Смежные вопросы