Как работает массив символов - PullRequest
0 голосов
/ 16 октября 2019

Попробуйте приведенные ниже коды

Program1

#include<stdio.h>
int main()
{
    int i=2;  //two times
    while(i>0)
    {
        char ch[2];  
        scanf("%s",ch);   
        printf("%s\n",ch);
        i--;
     }
    return 0;
}

вывод (цикл никогда не заканчивается и принимает и печатает любую длину строки)

wdefgfvcdswdfetgyhujik
wdefgfvcdswdfetgyhujik
nbvewsq
nbvewsq
hgbvfdw
hgbvfdw
hbgfvedw
hbgfvedw
gfvdcwsq
gfvdcwsq
.
.
.

вывод (цикл завершается, когда он принимает действительный набор строк)

a
a
b
b

program2

#include<stdio.h>
int main()
{
    char ch[2]; 
    scanf("%s",ch);   
    printf("%s\n",ch);

    return 0;
}

вывод (Как он печатает и говорит ошибку сегментации)

sxdfvghujiuytredwsazxacdfv
sxdfvghujiuytredwsazxacdfv
Segmentation fault

1 Ответ

3 голосов
/ 16 октября 2019

Относительно первой проблемы:

Если вы отладите программу, вы можете легко увидеть, что причиной является бесконечный цикл, поскольку вы перезаписываете i, не используя scanf должным образомисправление для второй проблемы должно исправить это.

Относительно второй проблемы:

Вы используете функцию scanf, которая небезопасна из-зак тому факту, что он читает весь ввод от пользователя независимо от размера выделенного буфера (в вашем случае char ch[2].

, поэтому, хотя он и вводит всю строку sxdfvghujiuytredwsazxacdfv в ch, этоочевидно переполнен -> таким образом ошибка сегментации неизбежна. Вместо этого используйте scanf_s и ограничьте количество символов для чтения.

Примечание:

Если вы будете поднимать флаги предупреждениядолжно показаться, что scanf проблематично и небезопасно

...