Разница между ' 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; }