我知道%s是一串字符,但我不知道如何使用它.任何人都可以提供一个非常基本的例子,说明它的使用方式以及它与char的不同之处?
(编辑)的
我进入这门课程已经两周了,这是我第一次编程.我不允许在作业中使用尚未教授的材料,所以这就是我问的原因.我有几本关于C的书并且用Google搜索但仍然不确定,所以我问道.(感谢所有的下选票)下面给出的所有例子都使用了尚未教授的数组,所以我假设我还不能使用%s.谢谢.
对于这两个*printf和*scanf,%s预计相应的参数为类型char *,以及用于scanf,它最好点到一个可写缓冲器(即,不是一个字符串).
char *str_constant = "I point to a string literal";
char str_buf[] = "I am an array of char initialized with a string literal";
printf("string literal = %s\n", "I am a string literal");
printf("str_constant = %s\n", str_constant);
printf("str_buf = %s\n", str_buf);
scanf("%55s", str_buf);
Run Code Online (Sandbox Code Playgroud)
%s在scanf没有explcit字段宽度的情况下使用in会打开相同的缓冲区溢出漏洞gets; 也就是说,如果输入流中的字符数多于目标缓冲区的大小以容纳,scanf则会愉快地将这些额外的字符写入缓冲区外的内存,这可能会破坏重要的内容.不幸的是,与in不同printf,你不能将该字段作为运行时参数提供:
printf("%*s\n", field_width, string);
Run Code Online (Sandbox Code Playgroud)
一种选择是动态构建格式字符串:
char fmt[10];
sprintf(fmt, "%%%lus", (unsigned long) (sizeof str_buf) - 1);
...
scanf(fmt, target_buffer); // fmt = "%55s"
Run Code Online (Sandbox Code Playgroud)
编辑
使用scanf与%s转换说明将在第一个空格字符停止扫描; 例如,如果您的输入流看起来像
"This is a test"
Run Code Online (Sandbox Code Playgroud)
然后scanf("%55s", str_buf)将阅读并分配"This"给str_buf.请注意,带有说明符的字段在这种情况下没有区别.