gpt4 book ai didi

c - Scanf和指针的误解

转载 作者:行者123 更新时间:2023-11-30 14:47:49 25 4
gpt4 key购买 nike

看看这个:

char* s;
scanf("%s", s);

一般来说,s是一个“内存盒”,它将包含另一个内存盒的地址,在这种情况下,它将是许多“内存盒”中的第一个,其中包含标记结束的“\0”之前的字符字符串的。
*s 可以让我们访问“内存框”,即字符串。

现在回到代码,准确地说是 scanf,我读它如下:获取用户输入,这是一个字符串,因此是“%s”,并将其分配给 s。但这怎么可能呢? s 是引用,所以不应该是 scanf("%s", *s) 吗?

最佳答案

让我们举一个更简单的例子:

char c;
scanf("%c", &c);

在这个例子中,如果你想读取一个字符,那么你必须传递该字符的地址(c),以便该方法知道将结果字符放在哪里。

让我们扩展到一个字符串:

char *str;
scanf("%s", str);

在本例中,str 是字符串开头的地址,因此您可以将其传递给 scanf 并期望读取该字符串。

但是,这里有一个问题:str 指向字符串的开头,但该字符串实际上并不存在,您必须创建它。像这样:

char str[80];
scanf("%s", &str[0]);

正如您在这里看到的,str 现在是一个 80 个字符的字符串,您可以将该字符串开头的位置(地址)传递给 scanf。但是,您必须祈祷读取的字符串不超过 80 个字符,否则该方法将尝试在字符串范围之外写入。您可以通过告诉 scanf 要读取多少个字符来纠正此问题:

char str[80];
scanf("%79s", &str[0]);

关于c - Scanf和指针的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50950862/

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