Я пытаюсь понять этот код для вычисления сначала и последующих наборов грамматики.
В этом scanf
использовался с несколькими входами
scanf("%s%c",a[i],&ch);
где a
— двумерный массив, а ch
— символ. Кто-нибудь может объяснить смысл этой строки?
Вы никому не платите на SO за срочный ответ на ваш вопрос, люди здесь отвечают в свободное время, а не исходя из ваших потребностей.
После успешного вызова scanf()
, как показано (возвращаемое значение 2), a[i]
будет содержать строку без пробела, а ch
будет содержать символ пробела. Возможно, у вас произошло переполнение буфера, поскольку вы не ограничили размер строки, считываемой в a[i]
; вы не узнаете об этом до тех пор, пока что-то не пойдет не так, а это обычно происходит далеко от того места, где возникла проблема.
Джонатан Леффлер Большое спасибо. Это действительно помогает.
Как сказано в примечаниях scanf("%s%c",a[i],&ch);
попробуйте прочитать «слово» как строку в a[i]
и символ в ч
Поскольку «слово» заканчивается разделителем и между %s и %с нет пробела, если символ читается для установки ч, этот символ является первым разделителем.
Пример :
#include <stdio.h>
int main()
{
char s[10], ch;
printf("%d\n", scanf("%s%c", s, &ch));
printf("'%s' '%c' (%d)\n", s, ch, ch);
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc s.c
pi@raspberrypi:/tmp $ ./a.out
aze q
2
'aze' ' ' (32)
поэтому ч получает не д, а первый пробел после "aze"
Конечно в случае с азеenter
pi@raspberrypi:/tmp $ ./a.out
aze
2
'aze' '
' (10)
ч получить новая линия
Правильный способ не рисковать записывать из строки — установить максимальное количество символов, в моем примере выше scanf("%9s%c", s, &ch)
(9 вместо 10, чтобы иметь место для нулевого символа, заканчивающего строку)
Если доступное «слово» содержит не менее 10 символов, 10-й будет получен с помощью ч :
pi@raspberrypi:/tmp $ gcc s.c
pi@raspberrypi:/tmp $ ./a.out
1234567890
2
'123456789' '0' (48)
Добавление пробела между %s и %с изменяет поведение, поскольку разделители пропускаются между «словом» и возвращаемым символом, например:
#include <stdio.h>
int main()
{
char s[10], ch;
printf("%d\n", scanf("%9s %c", s, &ch));
printf("'%s' '%c' (%d)\n", s, ch, ch);
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc s.c
pi@raspberrypi:/tmp $ ./a.out
aze q
2
'aze' 'q' (113)
так что время ч становится д
Нет проблем, эта ссылка расскажет вам все об этом: cplusplus.com/reference/cstdio/scanf