Я пытаюсь сохранить 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;
}

Может кто подскажет, в чем проблема, и решение, пожалуйста? Спасибо

-1
verticese 25 Фев 2015 в 16:38

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);
    }
0
Vlad from Moscow 25 Фев 2015 в 16:22

Есть несколько проблем:

  1. Вы не можете использовать strlen(), если ввод не завершен должным образом '\0', а ваш массив - нет. Этот вызов дает неопределенное поведение.
  2. Печать символа с кодовой точкой 2, вероятно, заставит ваш терминал вести себя забавно, поскольку это не печатаемый символ. Вы должны использовать %d и преобразовать его в (int).

Также обратите внимание, что *(pointer + i) намного яснее , если вы запишете его как pointer[i].

2
unwind 25 Фев 2015 в 13:48