Почему старые значения в массиве все еще присутствуют?

-9

Пожалуйста, объясните этот результат. Проблема аналогична с scanf. Как массив можно повторно инициализировать каждый раз?
Входные данные:

HelloWorld
Tech

Выход:

eo  
Tech
TW

Код:

#include<stdio.h>  
#include<string.h>
int main()
{ char c[1024]; int i,d=1;
gets(c);
printf("%c%c\n",c[d],c[d+5]);
gets(c);
puts(c);
printf("%c%c\n",c[0],c[4+d]);
return 0;
}

спросил(а) 2018-06-09T22:03:00+03:00 2 года, 4 месяца назад
0
116

В C строки хранятся как массивы символов с нулевым символом. Это означает, что существует множество способов представления одной и той же строки: все в массиве символов после первого нулевого байта игнорируется, насколько это касается значения строки.

Когда первый gets вызов читает HelloWorld, он сохраняет символ 'H' в c[0], 'e' в c[1] ,..., 'd' в c[9] и 0 (нуль байт, а не '0') в c[10]. Содержимое c[11] c[1023] не изменяется.

Когда второй gets вызов, читает Tech, он сохраняет символ 'T' в c[0], 'e' в c[1], 'c' в c[2], 'h' в c[3] и 0 в c[4]. Содержание c[5] c[1023] не изменяется. В частности, c[5] все еще имеет значение W которое было установлено первым, gets вызов.

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

Как можно догадаться из того, что вы передаете массив символов gets, он просто пишет, что массив символов, он не выделяет новое хранилище. Когда gets читает строку 4 байт, то это пишет, что 4-байтовое строку плюс завершающий нулевой байт, и не трогать все, что приходит после того, как эти 5 байт. На самом деле, gets даже не знает размера массива (который почему gets практически непригодный для использования на практике и был удален из текущей версии языка C: если вы вводите строку, которая слишком долго массив, его будет перезаписывать все, что приходит после массива в памяти).

c[5] обращается к элементу массива c в позиции 5. Это происходит вне строки, но это не имеет отношения к тому, как работает доступ к массиву. Это доступ к массиву, а не доступ к строкам. C на самом деле не имеет строк изначально: он подделывает их массивами символов. Функции манипуляции строками обрабатывают свои аргументы как строки (т.е. они смотрят только на первый нулевой байт). Но доступ к массиву - это просто доступ к массиву, и программисту не нужно обращаться к строке или массиву за пределы.

ответил(а) 2018-06-10T03:22:00+03:00 2 года, 4 месяца назад
41

Пожалуйста, исправьте свои показания. Вы можете использовать 2, 3, 4 пробела, но 1 просто выглядит неправильно. Я не вижу использования библиотеки string.h.

Массив не очищается, но символы 0..3 заменяются новыми, а символ в позиции 4 равен \0. Вот почему вы можете прочитать символ из ранее введенного значения в позиции 5 в этом массиве.

ответил(а) 2018-06-09T22:54:00+03:00 2 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема