鱼C论坛

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

[已解决]关于scanf(scanf_s)的运用,求解

[复制链接]
发表于 2020-11-10 21:07:36 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 LiJay 于 2020-11-10 21:24 编辑

#include<stdio.h>
int main()
{
        char a[100];
        while (scanf_s("%s",&a[100]) != EOF)
        {
                int i;
                char s = a[0];
                for (i = 1; a[i] != '\0'; i++)
                {
                        if (s < a[i])
                        {
                                s = a[i];
                        }
                }
                for (i = 0; a[i] != '\0'; i++)
                {
                        if (a[i] != s)
                        {
                                printf("%c", a[i]);
                        }
                        else {
                                printf("%c(max)", a[i]);
                        }
                }
                printf("\n");
        }
        return 0;
}

这是全部代码。问题出在scanf_s("%s",&a[100])上,如果这样的话随便输入一串字符串总会报错,
然而将 scanf_s("%s",&a[100])  改成  scanf_s("%s",a,100)却不会报错能够正常运行
这是为什么呢?scanf_s("%s",a,100)的含义是什么呢?
(目前我只知道scanf_s("%d"),&a),scanf_s("%s"),&a),scanf_s("%c"),&a)。。。这样的("%  ",&  )是将前面的数据类型赋值给后面的变量)
想知道scanf_s("%s",a,100)里为什么不用&符号并且一个%s后面却有两个量;  如果单独a的话提示就是涉及指针,加个常量100代表什么呢?
最佳答案
2020-11-10 22:30:20
本帖最后由 jackz007 于 2020-11-10 22:34 编辑
while (scanf_s("%s",&a[100]) != EOF)
改为:
while (scanf_s("%s" , a , 100) != EOF)
试试

a 本身就是存储地址,代表字符数组 a[] 的起始地址,等效于 & a[0]。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-10 22:16:55 | 显示全部楼层
scanf_s 是 scanf这个函数的safe 也就是 安全版本,应该是微软的C/C++编译器独有的函数。
后面的100表示输入缓冲区的最大限制,也就是说超过100个字符,就不再被当成输入了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-10 22:30:20 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-11-10 22:34 编辑
while (scanf_s("%s",&a[100]) != EOF)
改为:
while (scanf_s("%s" , a , 100) != EOF)
试试

a 本身就是存储地址,代表字符数组 a[] 的起始地址,等效于 & a[0]。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-11 00:33:20 | 显示全部楼层

那么a逗号后面的常数代表什么意思呢?
是不是定义了char类型的字母 用scanf就不用加&了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-11 10:36:56 | 显示全部楼层
本帖最后由 jackz007 于 2020-11-11 10:43 编辑
LiJay 发表于 2020-11-11 00:33
那么a逗号后面的常数代表什么意思呢?
是不是定义了char类型的字母 用scanf就不用加&了


      scanf_s() 中 a 后面那个 100 是 字符数组 a 的容量,scanf_s() 函数在用作输入字符串时,在接收字符串变量的后面必须要有这个数值,用来告诉 scnaf_s() 字符串空间的大小,以避免因内存越界使用而给程序运行带来灾难。
      定义了字符数组 a[] ,在用 scanf() 输入字符串时,a 本身表达的就是内存地址,所以,不可以在 a 前面使用 & 了。
      考察下面的代码可以加深理解,这个代码采用了三种不同的途径从键盘获取字符串输入,然后,分别打印输出。
#include <stdio.h>
int main(void)
{
        char a[100]                                     ;
        int k                                           ;
        printf("input something 01 : ")                 ;
        for(k = 0 ; k < 12 ; k ++) scanf("%c" , & a[k]) ;
        a[k] = '\0'                                     ;
        printf("%s\n\n" , a)                            ;
        printf("input something 02 : ")                 ;
        scanf("%s" , a)                                 ;
        fflush(stdin)                                   ;
        printf("%s\n\n" , a)                            ;
        printf("input something 03 : ")                 ;
        for(k = 0 ; k < 12 ; k ++) a[k] = getchar()     ;
        a[k] = '\0'                                     ;
        printf("%s\n" , a)                              ;
}
        编译、运行实况:
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
input something 01 : hello,world!
hello,world!

input something 02 : hello,world!
hello,world!

input something 03 : hello,world!
hello,world!

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

使用道具 举报

 楼主| 发表于 2020-11-16 23:53:19 | 显示全部楼层
jackz007 发表于 2020-11-11 10:36
scanf_s() 中 a 后面那个 100 是 字符数组 a 的容量,scanf_s() 函数在用作输入字符串时,在接收 ...

这串代码后的a[k]='\0'是什么意思呢?a[k]不是在上方被scanf(“%c”,&a[k])赋值了吗。这样的话后面为什么不会被替换成'\0'呢?fflush(stdin);这串代码还没学到,刚刚百度了下,感觉有点没看懂,大佬能方便解释吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 09:37:39 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2020-11-17 09:41 编辑
LiJay 发表于 2020-11-16 23:53
这串代码后的a[k]='\0'是什么意思呢?a[k]不是在上方被scanf(“%c”,&a[k])赋值了吗。这样的话后面为 ...


       因为是通过scanf("%c" , & a[k]) 而不是scanf("%s" , a) 来输入字符串的,前者只能逐个读入字符,并不会在最后为你添加字符串结束标志字符'\0',而后者是一次性整体读入,最后会自动添加。这一句代码就是专门为 a 添加末尾的字符串结束标志字符的。你不妨把这一句代码注释掉,然后编译运行,看看有什么现象发生,可能就会有所体会的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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