LiJay 发表于 2020-11-10 21:07:36

关于scanf(scanf_s)的运用,求解

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

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

这是全部代码。问题出在scanf_s("%s",&a)上,如果这样的话随便输入一串字符串总会报错,
然而将 scanf_s("%s",&a)改成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代表什么呢?

shooan 发表于 2020-11-10 22:16:55

scanf_s 是 scanf这个函数的safe 也就是 安全版本,应该是微软的C/C++编译器独有的函数。
后面的100表示输入缓冲区的最大限制,也就是说超过100个字符,就不再被当成输入了。

jackz007 发表于 2020-11-10 22:30:20

本帖最后由 jackz007 于 2020-11-10 22:34 编辑

while (scanf_s("%s",&a) != EOF)
改为:
while (scanf_s("%s" , a , 100) != EOF)
试试

a 本身就是存储地址,代表字符数组 a[] 的起始地址,等效于 & a。

LiJay 发表于 2020-11-11 00:33:20

jackz007 发表于 2020-11-10 22:30
改为:

试试


那么a逗号后面的常数代表什么意思呢?
是不是定义了char类型的字母 用scanf就不用加&了

jackz007 发表于 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                                     ;
      int k                                           ;
      printf("input something 01 : ")               ;
      for(k = 0 ; k < 12 ; k ++) scanf("%c" , & a) ;
      a = '\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 = getchar()   ;
      a = '\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>

LiJay 发表于 2020-11-16 23:53:19

jackz007 发表于 2020-11-11 10:36
scanf_s() 中 a 后面那个 100 是 字符数组 a 的容量,scanf_s() 函数在用作输入字符串时,在接收 ...

这串代码后的a='\0'是什么意思呢?a不是在上方被scanf(“%c”,&a)赋值了吗。这样的话后面为什么不会被替换成'\0'呢?fflush(stdin);这串代码还没学到,刚刚百度了下,感觉有点没看懂,大佬能方便解释吗?

jackz007 发表于 2020-11-17 09:37:39

本帖最后由 jackz007 于 2020-11-17 09:41 编辑

LiJay 发表于 2020-11-16 23:53
这串代码后的a='\0'是什么意思呢?a不是在上方被scanf(“%c”,&a)赋值了吗。这样的话后面为 ...

       因为是通过scanf("%c" , & a) 而不是scanf("%s" , a) 来输入字符串的,前者只能逐个读入字符,并不会在最后为你添加字符串结束标志字符'\0',而后者是一次性整体读入,最后会自动添加。这一句代码就是专门为 a 添加末尾的字符串结束标志字符的。你不妨把这一句代码注释掉,然后编译运行,看看有什么现象发生,可能就会有所体会的。
页: [1]
查看完整版本: 关于scanf(scanf_s)的运用,求解