我看到一个程序输入一个字符串而不使用%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;
}
答案 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
基本上是不必要的,可能是一个错误。
应该注意的是,代码有三个(或最有可能是四个)错误,并且不会如图所示工作。有人应该专注于混淆正确的代码来开始。
scanf
读入未初始化指针指向的缓冲区。如果它有效,那就是纯粹的机会。它应该是读入已分配的缓冲区。
在scanf
中使用不带长度的字符串转换也是一个错误。
格式字符串末尾的s
可能无效,除非意图与字符串末尾的文字s
匹配。这是一个错误:
指定无限长度的字符串转换无效(如果允许)。
如果字符串转换符合全长,则会加工。
printf(s2)
,其中s2
由用户输入,也是一个错误。
我必须强调#2和#4不是安全漏洞"或任何这样的事情,只是错误简单明了。如果任何教科书显示这样的代码,作者应该被拖过热煤。 我的意思是。它有时会工作,有时会崩溃,而另一次它会格式化你的硬盘。
代码应该是这样的:
int main()
{
char *s1 = "%255[^\n]";
char s2[256];
printf("Enter the string: ");
scanf(s1, s2);
printf("%s\n", s2);
return 0;
}