Почему я дважды печатаю заявление? [Дубликат]

Я думаю, что предоставленные ответы вводят в заблуждение. Свойство, определенное внутри класса, становится свойством экземпляра, когда объект создается, независимо от того, как вы его определяете. Таким образом, копии a.list сделаны, а x.list и y.list - разные копии. Причина, по которой они кажутся одинаковыми, заключается в том, что они оба являются псевдонимами в том же списке. Но это следствие того, как работают списки, а не того, как работают классы. Если бы вы делали то же самое с числами вместо списков (или просто используя + = вместо append, что создало бы новый список), вы увидите, что изменение x.attr не влияет на изменение y.attr.

Определяет self.list внутри __init__, потому что функция вызывается дважды, один раз для каждого экземпляра объекта, и поэтому создается два разных списка.

1
задан Yu Hao 24 July 2015 в 00:47
поделиться

2 ответа

Точка 1 [Программная ошибка]

Проблема заключается в использовании с спецификатором формата %c. Он считает ранее введенным \n, сохраненным нажатием клавиши ENTER после предыдущего ввода. Вы хотите

scanf(" %c", &tag[i].owner);
       ^
       |
    note the space

пропустить любой ведущий символ пробела, такой как символ (включая \n) до фактического ввода.

Точка 2 [Логическая ошибка]

В соответствии с вашим кодом здесь, в scan введите string , вам нужно использовать спецификатор формата %s.

Итак, наконец, ваш код должен выглядеть как

   scanf("%s", tag[i].owner);    // if tag[i].owner is char array

или

  scanf(" %c", &tag[i].owner);    // if tag[i].owner is a char, just in case
8
ответ дан Sourav Ghosh 25 August 2018 в 23:59
поделиться

% c - спецификатор для символа, вы пытаетесь ввести строку, а не символ. См. документацию scanf . То, что вы хотите использовать, - это спецификатор% s для строки.

0
ответ дан Ian 25 August 2018 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: