`scanf("%19 [^ \ n] s",str);`和`scanf("%19 [^ \ n]",str)之间的差异;`

时间:2014-10-26 09:38:51

标签: c scanf

  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 个答案:

答案 0 :(得分:5)

由于您已撰写"%19[^\n]",因此您不需要%s来表明它是一个字符串。 它已由您想要阅读的字符数(19)指定。

声明:

 scanf("%19[^\n]s",str);

需要一个字符串,然后需要s个字符。

回答你的问题:我应该使用哪一个?

都不是。使用fgets进行此特定输入。

答案 1 :(得分:3)

让我们说输入是

Line one
stuvwxyz

第一个scanf()"Line one"读入str,然后无法读取s;
第二个scanf()"Line one"读入str并且不会失败。
在这两种情况下,输入位置都在"第一行"结束时的换行符。

如果scanf()在转换字符串中有空格来使用换行符(不一定是个好主意)

scanf("%19[^\n] s", str);
scanf("%19[^\n] ", str);

然后是另一个scanf(),第一个scanf的代码将在"tuvwxyz"中读取;第二个代码将显示为"stuvwxyz"

答案 2 :(得分:3)

该程序只读取一个输入。由于%19[^\n]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;
}