2017-01-01 6 views
0

Так что у меня этот код:Программа не печатает символ, когда я ввожу строку

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

Когда я вхожу в характере B, как S, то иероглиф у как a, он прекрасно работает. Он печатает

a 
S 

Однако, когда я вхожу 2 символов для у как ab, он печатает два символа, но не печатает из S. Отпечатки:

ab 

Я что-то не так?

ответ

5

Прежде всего, char массива, определенный как y[2] может содержать только один char и другое пространство зарезервировано для завершения нуля для этого массива вести себя как строки. Другими словами, максимальная длина от строки он может содержать только 1.

Тем не менее, в соответствии с пониманием, вы должны изменить

scanf("%s",y); 

в

scanf("%1s",y); 

в ограничьте входную длину. В противном случае вы столкнетесь с переполнением буфера, который вызывает undefined behavior.

Для того, чтобы уточнить, что при добавлении в строке формата буквального 1, что 1 обозначает ширину максимальное поле.

Цитирование C11, глава §7.21.6.2, fscanf(), (курсив мой)

Элемент ввода считывается из потока, если спецификация не включает в себя п спецификатор. Элемент ввода определяется как самая длинная последовательность входных символов, которая не превышает любую указанную ширину поля и которая является или является префиксом соответствующей последовательности ввода. [....]

+0

спасибо за ответ, но мне любопытно: как добавление «1» влияет на код? –

+1

@ DanielToh Это говорит, что он читает не более 1 символа в 'y', поэтому он не выходит за пределы. – Barmar

+0

@ DanielToh добавил мой ответ, чтобы обратиться к этому. :) –