массив char в c в переполненной операции scanf - PullRequest
0 голосов
/ 23 сентября 2019

Я новичок в программировании на C и действительно запутался в приведенном ниже коде:

#include <stdio.h>
#include <string.h>
int main(void)
{
    char arrstr[6];
    int i;
    printf("Enter: ");
    scanf("%s",arrstr);
    printf("arrstr is %s\n",arrstr);
    printf("length os arrstr is %d\n",strlen(arrstr));
    for(i=0;i<20;i++)
    {
         printf("arrstr[%d] is %c, dec value is %d\n",i,arrstr[i],arrstr[i]);
    }
    return 0;
 }   

Насколько я понимаю, после объявления arrstr [6] компилятор выделит 6 байтов для этого символаВ массиве и с учетом последнего символа '\ 0' в массиве char можно сохранить 5 действительных символов.

Но после запуска этого короткого кода я получаю следующий результат: enter image description here

printf показывает все введенные символы, независимо от того, как долго это будет.Но когда я использую индекс для проверки массива, кажется, я не могу найти дополнительные символы в массиве.

Может кто-нибудь помочь объяснить, что произошло?

Спасибо.

1 Ответ

0 голосов
/ 23 сентября 2019

Попробуйте изменить код, добавив следующую строку сразу после инструкции scanf:

arrstr[5] = '\0';

В результате пользовательский ввод перезаписал нулевой символ.Возврат нулевого символа обратно вручную дает правильное поведение для следующих двух строк, операторов printf.Цикл for - это другое дело.C не имеет никакой проверки границ, поэтому программист не должен выходить за границы массива.Значения, которые вы получите после этого, могут быть чем угодно, так как вы просто читаете неинициализированные байты ОЗУ в этот момент.Стандартный способ избежать этого - использовать переменную const int для объявления размера массива:

const int SIZE = 6;
char arrstring[SIZE];

Затем также использовать SIZE в качестве ограничения в цикле for.

PSпроблема здесь с пользовательской записью, как написано, потому что пользователь теоретически мог бы вводить сотни символов, и это, казалось бы, было бы записано за пределами допустимого, что может привести к странным ошибкам.Есть способы ограничить количество пользовательских входов, но это довольно сложно, вот несколько сообщений stackoverflow по теме.Примите во внимание, что в будущем вы сможете:

Ограничение ввода пользователя с помощью fgets вместо scanf

Очистка потока stdin после использования fgets

...