Scanf和指针的误解

时间:2018-06-20 14:40:13

标签: c pointers scanf

看看这个:

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

通常,s是一个“内存盒”,它将包含另一个地址,在这种情况下,它将是多个“ char”中包含字符的“内存盒”中的第一个,该字符前面有字符“ \ 0”的字符串。
* s可以让我们访问“内存盒”,即字符串。

现在回到代码并精确地读入scanf,我按如下方式进行阅读:接受用户输入(为字符串,因此为“%s”)并将其分配给s。但是怎么可能呢? s是参考,所以不应该是scanf("%s", *s)吗?

1 个答案:

答案 0 :(得分:1)

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

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]);