当前位置:  开发笔记 > 编程语言 > 正文

为什么scanf("%s",&str); 表现为scanf("%s",str);?

如何解决《为什么scanf("%s",&str);表现为scanf("%s",str);?》经验,为你挑选了1个好方法。

看下面的代码:

#include 

int main()
{
    char str[80];
    int n;
    scanf("%s%n",str,&n);
    printf("%s\t%d",str,n);
    putchar('\n');
    getchar(); //to remove '\n'
    scanf("%s%n",&str,&n);
    printf("%s\t%d",str,n);
    return 0;
}

这是输入和输出:

abc
abc     3
123
123     3

我们知道,它scanf是一个可变参数函数,因此在调用它时它的参数不会被转换.因此,参数必须以与它们应该完全相同的类型传递.然而,类型strIS char *(从衰减char (*)[80]),而&str具有的类型char (*)[80],虽然它们具有相同的,即&str[0].

那么为什么可以scanf("%s",&str);正常工作而不会因指针运算而导致段错误呢?



1> Tom Karzes..:

两个指针值(str&str)具有相同的二进制值,即地址str.但是,它们具有不同的类型:作为参数传递时,str转换为类型char *,而&str具有类型char (*)[80].前者是正确的,而后者是不正确的.它工作正常,但你使用的指针类型不正确,实际上gcc警告不正确的参数类型scanf.


str的类型为char [80],但它会衰减为char*.
这与作为一个论点传递无关.在许多用法中,数组衰减为指针.然而,将'str`称为_pointer_是错误的,就像你在答案的第一句中所做的那样.
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有