鱼C论坛

 找回密码
 立即注册
查看: 2957|回复: 6

[已解决]为什么char %s就可以??

[复制链接]
发表于 2020-2-15 23:14:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>

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

        printf("%d\n",a);
       
       
        return 0;
}
最佳答案
2020-2-16 16:34:14
本帖最后由 major_lyu 于 2020-2-16 21:39 编辑
kajun 发表于 2020-2-16 15:52
感谢你的耐心回复
我说char %s是这样子,就能正常输出 而换成int就输出其他数字 你说的东西我也会看一 ...


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

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


你可以用下面的代码验证一下:
#include<stdio.h>

int main()
{
        char b[123];
        int a[123];
        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[0]); //十进制形式打印数组a第0个元素地址------------输出:XXXXXXXX
        printf("%d\n", a[0]); //十进制形式打印数组a第0个元素a[0]的值-----输出: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[0]);//十进制形式打印数组b第0个元素地址------------输出:YYYYYYYY 
        printf("%d\n", b[0]);//十进制形式输出字符数组b第0元素b[0]的ASCII码----输出:49;

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-15 23:18:42 | 显示全部楼层
这个你就得从 scanf的用法看起。百度找下 scanf
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-16 08:52:46 | 显示全部楼层
scanf那一行应该有错吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-16 12:48:08 | 显示全部楼层
scanf("%d",&a);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-16 13:47:46 | 显示全部楼层
本帖最后由 major_lyu 于 2020-2-16 14:05 编辑

你的问题每太看懂。

没看到char %s在哪

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


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

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

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

#include<stdio.h>

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[123];
    printf("输入");
    scanf("%s", a);

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


    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-16 16:34:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 major_lyu 于 2020-2-16 21:39 编辑
kajun 发表于 2020-2-16 15:52
感谢你的耐心回复
我说char %s是这样子,就能正常输出 而换成int就输出其他数字 你说的东西我也会看一 ...


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

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


你可以用下面的代码验证一下:
#include<stdio.h>

int main()
{
        char b[123];
        int a[123];
        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[0]); //十进制形式打印数组a第0个元素地址------------输出:XXXXXXXX
        printf("%d\n", a[0]); //十进制形式打印数组a第0个元素a[0]的值-----输出: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[0]);//十进制形式打印数组b第0个元素地址------------输出:YYYYYYYY 
        printf("%d\n", b[0]);//十进制形式输出字符数组b第0元素b[0]的ASCII码----输出:49;

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 12:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表