Разница между ' scanf ("%19[^n] s", str); ' и ' scanf ("%19[^n]", str);`
Это
char str[20];
scanf("%19[^n]s",str);
getchar(); // To remove the `n`
printf(str);
И
char str[20];
scanf("%19[^n]",str);
getchar(); // To remove the `n`
printf(str);
Дают те же результаты. Я знаю, что [^n]
сканирует, пока не встретит n
. Но чего я не мог понять, так это того, что
- Есть ли какие-либо различия между этими двумя
- разве не нужно
s
во второмscanf
? - какой из них я должен использовать для сканирования строки?
scanf
?
3 ответа:
Предположим, что входной сигнал равен
Line one stuvwxyz
Первый
scanf()
читает"Line one"
вstr
, а затем не может прочитать s;
Второйscanf()
читает"Line one"
вstr
и не терпит неудачи.
В обоих случаях входная позиция находится в новой строке в конце "строки один".Если у
scanf()
есть пробел в строке преобразования, чтобы использовать новую строку (не обязательно хорошая идея)scanf("%19[^\n] s", str); scanf("%19[^\n] ", str);
И за ним последовал другой
scanf()
, код с первым сканфом читался бы в"tuvwxyz"
; код со вторым гласил бы"stuvwxyz"
.
Поскольку вы написали
"%19[^\n]"
, вам не нужен%s
, который указывает, что это строка. Он уже определен количеством символов (19), которые вы хотите прочитать.Утверждение:
scanf("%19[^\n]s",str);
Ожидает строку, а затем ожидает символ
s
.Чтобы ответить на ваш вопрос: какой из них я должен использовать?
Ни один. Используйте
fgets
для этого конкретного ввода.
Эта программа будет считывать только один вход. Как
%19[^\n]s
не удается прочитать ' s '#include<stdio.h> #include<stdlib.h> int main() { char acText[20] = {""}; char acTexts[20] = {""}; scanf ( "%19[^\n]s %19[^\n]", acText, acTexts); printf ( "%s\n", acText); printf ( "%s\n", acTexts); return 0; }
Эта программа будет читать два входа
#include<stdio.h> #include<stdlib.h> int main() { char acText[20] = {""}; char acTexts[20] = {""}; scanf ( "%19[^\n] %19[^\n]", acText, acTexts); printf ( "%s\n", acText); printf ( "%s\n", acTexts); return 0; }