我不明白什么是%[^ \ n]

时间:2014-09-08 16:15:15

标签: c

我看到一个程序输入一个字符串而不使用%s,%c格式说明符和get,fgets函数甚至。可以解释一下这段代码的每一行吗? s1是字符指针。但指针需要解决。这是什么“\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \声明。

我读过K& R的ANSI C书,但它并不存在。 C的圣经没有这个概念。怎么会?请告诉我在哪里阅读更多关于%[^ \ n]的信息。我可以在哪里使用这个概念。

int main()
{
char *s1 = "\45\133\136\12\135\163", *s2;
printf("Enter the string: "); 
scanf(s1,s2);
printf(s2);
return 0;
}

1 个答案:

答案 0 :(得分:8)

您的代码只是模糊处理,完全等同于:

int main()
{
  char *s1 = "%[^\n]s", *s2;
  printf("Enter the string: "); 
  scanf(s1, s2);
  printf(s2);
  return 0;
}

模糊字符串文字"\45\133\136\12\135\163"正在使用八进制字符表示。例如,'\12'是字符代码10,LF,与'\n'相同。

让我们解码格式字符串:

  • % - 介绍转化
  • [ - 从指定的集合
  • 开始匹配非空字符序列
  • ^ - 表示要从
  • 排除以下字符
  • \n - 集合排除换行符(字符代码10)
  • ] - 结束设置规范和转化
  • s - 匹配文字s

因此,scanf将输入任何不包含换行符的非空字符串,只要它后跟s即可。 s基本上是不必要的,可能是一个错误。

BUGS

应该注意的是,代码有三个(或最有可能是四个)错误,并且不会如图所示工作。有人应该专注于混淆正确的代码来开始。

  1. scanf读入未初始化指针指向的缓冲区。如果它有效,那就是纯粹的机会。它应该是读入已分配的缓冲区。

  2. scanf 中使用不带长度的字符串转换也是一个错误。

  3. 格式字符串末尾的s可能无效,除非意图与字符串末尾的文字s匹配。这是一个错误:

    • 指定无限长度的字符串转换无效(如果允许)。

    • 如果字符串转换符合全长,则会加工。

  4. printf(s2),其中s2由用户输入,也是一个错误

  5. 我必须强调#2和#4不是安全漏洞"或任何这样的事情,只是错误简单明了。如果任何教科书显示这样的代码,作者应该被拖过热煤。 我的意思是。它有时会工作,有时会崩溃,而另一次它会格式化你的硬盘。

    代码应该是这样的:

    int main()
    {
      char *s1 = "%255[^\n]";
      char s2[256];
      printf("Enter the string: "); 
      scanf(s1, s2);
      printf("%s\n", s2);
      return 0;
    }