kajun 发表于 2020-2-15 23:14:02

为什么char %s就可以??

#include<stdio.h>

int main()
{
        int a;
        printf("输入");
        scanf("%d",a);

        printf("%d\n",a);
       
       
        return 0;
}

ba21 发表于 2020-2-15 23:18:42

这个你就得从 scanf的用法看起。百度找下 scanf

Sungne_jer 发表于 2020-2-16 08:52:46

scanf那一行应该有错吧

zltzlt 发表于 2020-2-16 12:48:08

scanf("%d",&a);

major_lyu 发表于 2020-2-16 13:47:46

本帖最后由 major_lyu 于 2020-2-16 14:05 编辑

你的问题每太看懂。

没看到char %s在哪

感觉你目前的代码是可以编译通过的。


scanf读入数据的目标变量必须为地址类型(指针)。
int a;定义a是一个数组,因此a表示数组的首地址,即a, &a是一个意思。
所以这种情况下scanf("%d",a)的作用和scanf(”%d“, &a)的意思是一样的,即将读入的数据存放到数组第一个元素。
而如果定义int a;
那么必须写成scanf("%d",&a)。&a表示的是变量a的地址。

另外;printf("%d\n", a);这一行应该是有问题的。输出结果应该是数组a的地址,而不是a的数据。
要想输出数组第一个元素的数据,必须用printf("%d\n", a);或者printf("%d\n", *a);

最后,我猜你想问的是为什么下面的代码可以正确输出a的第一个元素。

#include<stdio.h>

int main()
{
      char a;
      printf("输入");
      scanf("%c",a);

      printf("%s\n",a);
      
      
      return 0;
}
这就要涉及到字符数组和字符串的关系了。在C语言中,可以简单的认为字符数组和字符串是一样的。字符数组char a相当于定义也一个长度为123的字符串,知识字符串中的数据没有初始化,a既表示字符数组名,字符数组地址也表示字符串a。
printf("%s\n",a);将字符数组a中的数据按照字符串的形式输出,当然是可以的了。

kajun 发表于 2020-2-16 15:52:57

major_lyu 发表于 2020-2-16 13:47
你的问题每太看懂。

没看到char %s在哪


感谢你的耐心回复
我说char %s是这样子,就能正常输出 而换成int就输出其他数字 你说的东西我也会看一下,我还是刚刚学计算机,希望多包容
#include<stdio.h>

int main()
{
    char a;
    printf("输入");
    scanf("%s", a);

    printf("%s\n", a);


    return 0;
}

major_lyu 发表于 2020-2-16 16:34:14

本帖最后由 major_lyu 于 2020-2-16 21:39 编辑

kajun 发表于 2020-2-16 15:52
感谢你的耐心回复
我说char %s是这样子,就能正常输出 而换成int就输出其他数字 你说的东西我也会看一 ...

char a是字符数组,可以按照字符串输出。scanf("%s",a)是以字符串形式读入,本质上是将输入字符的ASCII码写入到字符数组a中,并且系统会自动在你输入的最后一个字符之后增加一个’\0',表示字符串终止。比如你输入的是123, 那么数组a的前三个元素分别是字符’1‘’2‘’3‘的ASCII码,即十进制数的49,50,51,第四个元素为‘\0', 即二进制的00000000。你用printf("%s",a)输出时,就会将字符数组当作字符串输出所有字符。需要注意的是,作为字符串输出时碰到字符‘\0',就会认为字符串结束,停止输出后面的字符。

而int a是整型数组。scanf("%d", a)只能读入一个整形数据,并将数据存储到a中,例如你输入的是123,则数组a的第一个元素会被改写成123。
这时你如果用printf("%s",a)输出,输出的第一个字符应该是ASCII码对应的字符’{‘.
如果用printf("%d", a)输出,输出的应该是一串数组,这个数字实际上是数组a第一个元素在内存的位置编号,也就是地址。


你可以用下面的代码验证一下:

#include<stdio.h>

int main()
{
        char b;
        int a;
        printf("输入a:\n");
        scanf("%d", a);   //假设输入123

        printf("%s\n", a); //以字符串形式打印数组a的值,------------------输出:{
        printf("%d\n", a); //十进制形式打印数组a第0个元素地址------------输出:某个地址数据XXXXXXXX
        printf("%d\n", &a); //十进制形式打印数组a第0个元素地址------------输出:XXXXXXXX
        printf("%d\n", &a); //十进制形式打印数组a第0个元素地址------------输出:XXXXXXXX
        printf("%d\n", a); //十进制形式打印数组a第0个元素a的值-----输出:123

       
        printf("输入b:\n");
        scanf("%s", b);//假设输入123

        printf("%s\n", b); //以字符串形式打印字符数组------------------输出:123
        printf("%d\n", b);//十进制形式打印数组b第0个元素地址------------输出:某个地址数据YYYYYYYY
        printf("%d\n", &b);//十进制形式打印数组b第0个元素地址------------输出:YYYYYYYY
        printf("%d\n", &b);//十进制形式打印数组b第0个元素地址------------输出:YYYYYYYY
        printf("%d\n", b);//十进制形式输出字符数组b第0元素b的ASCII码----输出:49;

        return 0;
}
页: [1]
查看完整版本: 为什么char %s就可以??