gpt4 book ai didi

c - 如何在 C 中正确使用 %s?

转载 作者:太空狗 更新时间:2023-10-29 16:44:08 29 4
gpt4 key购买 nike

我知道%s是一串字符,但是不知道怎么用。谁能给我提供一个非常基本的例子,说明它是如何使用的,以及它与 char 有何不同?


下面给出的所有示例都使用了尚未教授的数组,因此我假设我也不能使用 %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);

scanf 中使用 %s 而没有明确的字段宽度会打开与 gets 相同的缓冲区溢出攻击;也就是说,如果输入流中的字符多于目标缓冲区的大小,scanf 将愉快地将这些额外的字符写入缓冲区外的内存,可能会破坏一些重要的东西。不幸的是,与 printf 不同,您不能将该字段作为运行时参数提供:

printf("%*s\n", field_width, string);

一种选择是动态构建格式字符串:

char fmt[10];
sprintf(fmt, "%%%lus", (unsigned long) (sizeof str_buf) - 1);
...
scanf(fmt, target_buffer); // fmt = "%55s"

编辑

scanf%s 转换说明符一起使用将在第一个空白字符处停止扫描;例如,如果您的输入流看起来像

"This is a test"

然后 scanf("%55s", str_buf) 将读取 "This" 并将其分配给 str_buf。请注意,在这种情况下,带有说明符的字段没有任何区别。

关于c - 如何在 C 中正确使用 %s?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9980878/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com