gpt4 book ai didi

c - 了解 C 中的 scanf

转载 作者:行者123 更新时间:2023-12-04 11:24:19 24 4
gpt4 key购买 nike

所以我对编程还很陌生,大约 3 天前我开始使用 C。我正在创建这个短程序来测试自己。这只是一个非常基本的 C 程序,询问您的名字和姓氏。这是代码:

#include <stdio.h>

int main()
{

char first[20];

char last[20];

printf("Please enter your first name:");
scanf("%s",&first);
printf("\nand Please enter your last name:");
scanf("%s",&last);
printf("Greetings fellow %s %s!\n",first,last);
return(0);
}

但是当我去编译的时候我每次都会得到这个错误:

checkname.c:9:警告:格式“%s”需要类型“char *”,但参数 2 的类型为“char (*)[20]”checkname.c:11:警告:格式“%s”需要类型“char *”,但参数 2 的类型为“char (*)[20]”

我知道我可以使用 gets() 但显然它很糟糕而且我不应该使用它。这段代码有什么问题?我不明白问题出在哪里。

最佳答案

I know I can use gets() except apparently it's bad and I shouldn't use it.

没错,没错——很容易出现缓冲区溢出错误。 scanf() 同样是邪恶的(部分原因是相同的 - 指定缓冲区长度并非易事,而且无论如何,它比必要的复杂得多,很难做到正确,而且是多余的对于简单的原始 I/O 来说很昂贵),也不要使用它。使用 fgets() 来获取用户输入,它可以让您将要写入的缓冲区的长度传递给它,从而避免被射中脚:

char buf[0x40];
fgets(buf, sizeof(buf), stdin);

现在您知道了“如何”,我将向您解释“为什么”。

据说数组在传递给函数时会分解为指针。如果您将 char [] 传递给函数,它会将其视为 char * 指向数组的第一个元素。这就是为什么您不必为 (char) 数组(概念上是 C 中的字符串)显式使用“addressof”(&) 运算符。

如果你使用它,你不会得到指向数组第一个元素的指针,而是指向数组本身的指针,那不是你想要的想要。

(一般来说,它可以工作,因为它显然对你有用,但理论上它会调用 undefined behavior,因为传入的表达式的实际类型和 %s 期望的类型转换说明符不匹配。)

This document是一本关于数组和指针的好书,请务必阅读并理解它。

关于c - 了解 C 中的 scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17500374/

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