Разница между ' 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. Но чего я не мог понять, так это того, что

    Есть ли какие-либо различия между этими двумя scanf?
  • разве не нужно s во втором scanf?
  • какой из них я должен использовать для сканирования строки?
3 2

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;
}