Я пытаюсь сохранить ints в указателе, используя его как массив. Но следующий код создает небольшие матрицы в терминале, и я не знаю почему. Вот мой код
int main(int argc, char const *argv[])
{
char pointer[7];
for (int i = 0; i < 3; i++)
{
*(pointer+i) = 2;
}
printf("%s%d\n", "the string length is ",strlen(pointer));
for (int j = 0; j < 3; j++)
{
printf("%c\n", *(pointer+j));
}
return 0;
}
Может кто подскажет, в чем проблема, и решение, пожалуйста? Спасибо
2 ответа
Похоже, вы имеете в виду следующее :)
int main(int argc, char const *argv[])
{
char pointer[7] = { '\0' };
for (int i = 0; i < 3; i++)
{
*(pointer+i) = '2';
}
printf("%s%zu\n", "the string length is ",strlen(pointer));
for (int j = 0; j < 3; j++)
{
printf("%c\n", *(pointer+j));
}
return 0;
}
После этого заявления
char pointer[7] = { '\0' };
Все элементы указателя массива инициализируются нулем. Таким образом, вы можете использовать стандартную функцию strlen
, примененную к этому массиву.
Функция strlen
имеет тип возврата size_t
, поэтому лучше использовать строку формата %zu
В этом заявлении
*(pointer+i) = '2';
Символ «2» присваивается элементам массива, поэтому, когда вы их распечатаете, вы действительно увидите символ 2 на консоли.
printf("%c\n", *(pointer+j));
Если вы хотите иметь дело с указателями, то, например, этот цикл
for (int j = 0; j < 3; j++)
{
printf("%c\n", *(pointer+j));
}
Ты мог бы переписать как
for ( char *p = pointer; *p; ++p )
{
printf("%c\n", *p);
}
Есть несколько проблем:
- Вы не можете использовать
strlen()
, если ввод не завершен должным образом'\0'
, а ваш массив - нет. Этот вызов дает неопределенное поведение. - Печать символа с кодовой точкой
2
, вероятно, заставит ваш терминал вести себя забавно, поскольку это не печатаемый символ. Вы должны использовать%d
и преобразовать его в(int)
.
Также обратите внимание, что *(pointer + i)
намного яснее , если вы запишете его как pointer[i]
.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.