精华内容
下载资源
问答
  • 为什么scanf不能输入
    2020-12-17 01:59:34

    代码:

    #include<stdio.h>
    int main(){
      char *pStr="this is a book";
      scanf("%s",pStr);//出错点
      
      printf("%s\n",pStr);
      return 0;
    }
    

    运行上面程序,会出现一个内存错误:Segmentation fault
    Why?
    你可能是这样想的:

    1.pStr指针指向数组的首地址
    2.利用scanf将键盘上的数据存放到pStr执行的内存地址
    3.pStr指针指向的内存空间的内容变成刚刚从键盘上输入的内容

    思路是对的!
    但是你忽略了一个问题:

    "this is a book"
    

    是一个字符串常量,存放在内存中的不可动态修改的【静态存储区】,
    所以指针pStr也指向那里,那里是存不进东西的,

    还有,scanf函数的后面参数都是内存地址,一般普通变量都需要加寻址符&,而一级指针变量啥都不用加,二级以上指针一般需要使用符号*解引用,所以你用scanf把数据存进【静态内存区】去就会报错。

    但是下面的形式是可以的,因为下面的形式并不是往静态内存里面存数据,而且改变指针变量pStr的指向而已,让它指向新的静态内存区,请注意,不是存数据,不要跟上面scanf混淆:因为"abc"本身就是一个地址,代表该字符串的首地址,只是赋值给指针变量pStr而已

    #include<stdio.h>
    int main(){
      char *pStr="this is a book";
      pStr="abc";//改变指针pStr的指向,指向新的静态存储区
      return 0;
    }
    

    综上,有些情况下还不如用数组型字符串。

    更多相关内容
  • while循环里不能输入两次(用两个scanf)嘛? 字符char换成整型int 型就可以 感觉就这一句代码的前后有问题 解决方法: 在scanf前加上getchar()语句; 详解出现问题原因: 当你输入数据后回车,数据才被函数...

    输入字符型变量时,scanf语句被忽略!!!!

    在这里插入图片描述
    while循环里不能输入两次(用两个scanf)嘛?
    在这里插入图片描述
    字符char换成整型int 型就可以
    在这里插入图片描述
    感觉就这一句代码的前后有问题
    在这里插入图片描述
    解决方法:
    在scanf前加上getchar()语句;

    详解出现问题原因: 当你输入数据后回车,数据才被函数“scanf()”读入,问题就出在这个“回车”上;
    在C里面回车键是当两个字符来用的: 即“回车(发送)”和“换行”;
    这样一来,问题就来了;
    当你紧接着在“scanf()”后面再来一句“scanf()”读入一个字符的时候,此时在第二个“scanf()”里面读入的不是你输入的那个字符~
    而是那个使人忽略的 “回车”字符;当然,要是你第二句“scanf()”不是输入字符而是输入数据的话,那就没有此问题出现。
    解决的办法是在第二个“scanf()”语句前加一句getchar(); 此处的getchar();就是用来吞噬掉前面的“回车”。

    样例代码:

    #include<stdio.h>
    #include <stdlib.h> //定义杂项函数及内存分配函数
    #include <string.h> //字符串处理
    
     int sumT(int sum) {
        /*递归算法:将原问题分解为规模最小的子问题,然后递归调用相同方法,
    	达到某个临界点,返回该值,来表示问题的解*/
    	if (sum < 0)
    		return 0;
    	else if (sum == 0)//一阶有一种走法
    		return 1;
    	if (sum > 0)
    		return sumT(sum - 1)+ sumT(sum - 2);
    	/*分别算出用一步一阶,一步两阶的走法,相加后得出所有的走法*/
    }
    
     main()
    {
      int N;
      char b;
      
      while (1){
    	printf("请输入楼梯台阶总数(1 < N < 50),N=");
    	scanf_s("%d",&N,2);
    	if (N > 1 && N < 50) 
    	{
    		printf("当楼梯台阶总数N= %d 时,爬楼方式有%d种\n", N, sumT(N));
    		printf("\n");
    
    
    	}else
    	{
    		printf("请重新输入正确的楼梯台阶总数!!!\n");
    		printf("\n");
    		continue;
    	}
    	printf("是否继续?(继续请按y或其它,退出请按n)\n");
    	getchar();
    	/*直接使用scanf会忽略该语句,从而出错,具体原因如下:    
    	当你输入数据后 回车,数据才被函数“scanf()”读入,问题
        就出在这个“回车”上;在C里面 回车 键是当两个字符来用的:即
      “回车(发送)”和“换行”;这样一来,问题就来了;当你紧接着在
      “scanf()”后面再来一句“scanf()”读入一个字符的时候,
      此时在第二个“scanf()”里面读入的不是你输入的那个字符~ 而是那个使人忽略的 “回车”字符;
      当然,要是你第二句“scanf()”不是输入字符而是输入数据的话, 那就没有此问题出现。
      解决的办法是在第二个“scanf()”语句前加一句getchar();
      此处的getchar();就是用来吞噬掉前面的“回车”。*/
    	scanf_s("%c", &b,4);
    	if (b == 'n')
    		break;
    	else if (b == 'y')
    		continue;
    	else continue;
      }
      return 0;
    }
    
    
    

    运行截图:
    在这里插入图片描述

    展开全文
  • 为什么scanf 函数中不能加\n

    千次阅读 2022-02-08 17:51:58
    为什么scanf函数中加了\n会出现这种情况呢? 原来, C程序执行scanf时,会从缓冲区读数据,如果缓冲区是空的,就阻塞住,等待你从键盘输入输入结束后按回车会执行scanf函数,程序会逐个...

    当代码是scanf(“%d\n”,&a);时

    如果你输入数字后一直按回车,scanf就会一直阻塞在那里,直到你再一次输入。

    而且运行结果只会识别第一个数,不会识别第二个数。如图,

     

     

    当你代码是scanf(“%d”,&a);时,代码就会很顺利的成功运行

    这是为什么呢?为什么scanf 函数中加了\n会出现这种情况呢?

    原来,

    C程序执行scanf时,会从缓冲区读数据,如果缓冲区是空的,就阻塞住,等待你从键盘输入。

    输入结束后按回车会执行scanf函数,程序会逐个读取缓冲区的数据,注意,这时会将\n留在缓冲区(缓冲区只剩下\n)

    当代码是scanf(“%d\n”,&a);时,scanf函数的第一个参数(即%d\n)指定了后面变量读取的格式,j就是会按照 数字 回车 的格式读取,当你输入数字结束按回车时,刚好满足这种形式,这时缓冲区内什么都没有。

    这时就需要再一次输入然后再按回车,使\n可以留在缓冲区。这样代码才会继续往下执行。

    而且,\n是回车的意思,scanf函数是输入函数,顾名思义,输入函数时不需要我们来换行。

    所以,使用scanf函数是不需要加\n的,加了反而会出错。

    参考https://blog.csdn.net/weixin_44967885/article/details/108994960 

    展开全文
  • scanf的用法

    千次阅读 2021-05-09 02:33:50
    1、 scanf()函数是格式化输入函数,它从标准输入设备(键盘)缓存中读取输入的信息。其调用格式: scanf("",),如下所示:inta;scanf("%d",&a);以上代码会将键盘的输入转换成int类型,并赋值给a。所有转换指定符...

    1、 scanf()函数是格式化输入函数,它从标准输入设备(键盘)缓存中读取输入的信息。

    其调用格式为: scanf("",),如下所示:

    inta;

    scanf("%d",&a);

    以上代码会将键盘的输入转换成int类型,并赋值给a。

    所有转换指定符的含义如下:

    转换字符

    含义

    d

    将输入转换成int

    i

    将输入转换成int。如果加了前缀0,就输入八进制数。0x或OX,则输入十六进制数

    o

    将输入转换成int,并假定所有的数字都是八进制数

    u

    将输入转换成unsigned int

    x

    将输入转换成int,并假定所有的数字都是十六进制数

    c

    将下一个字符读入为char类型(包含空白)。如果在读入单个字符时要忽略空白,就在格式指定符的前面加上一个空白字符。

    s

    从下一个非空白字符开始,输入一串连续的非空白字符

    e、f、g

    将输入转换成float类型,输入中的小数点和指数是可选的。

    n

    不读入任何输入,但前面读到此处为止的数字字符存储在对应的int*类型参数中

    下表中,是转换指定符的应用实例:

    指定符

    说明

    %lf

    将下一个值读取为double类型

    %*d

    读入下一个整数值,但不存储它

    %lc

    将一下字符读取为wchar_t类型

    %\nc

    将下一个字符读取为char类型,并忽略空白字符

    %10lld

    将接下来的10个字符读取为long long类型的整数值

    %5d

    将接下来的5个字符读取为一个整数

    %Lf

    将下一个值读取为long double类型的浮点数

    %hu

    将下一个值读取为unsigned short类型

    M

    指定输入数据所占宽度

    *

    空读一个字符,有了这个符号,只会读取,但不存储

    H

    输入“短”数据

    L

    输入“长”数据

    2、空白字符

    在scanf函数在从键盘读取的时候,会自动忽略一个或多个空白字符。

    3、非空白字符()

    一个非空白字符会使scanf函数在读取的时候,剔除掉与这个非空白字符相同的字符。

    地址表是需要读入的所有变量的地址,而不是变量本身,这个与printf()函数不同,需要特别注意!

    #include 

    intmain()

    {

    inti,j;

    printf("i = %d,j = %d\n",i,j);

    scanf("%d,%d",&i,&j);

    return0;

    }

    说明:scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型数。如果","这一特定字符没有找到,scanf()函数就终止。若参数之间的分隔符为空格,则参数之间必须输入一个或多个空格。

    4、地址问题

    对于字符串数组或者是字符串指针变量,由于数组名和指针变量名本身就是地址,因此在使用scanf函数的时候,不需要加&操作符。

    #include 

    intmain()

    {

    char*p = NULL;

    charstr1[20],str2[20];

    p = str2;

    scanf("%s",str1);

    printf("str1 = %s ",str1);

    printf("str2 = %s\n",p);

    return0;

    }

    输入:123 \n 345  输出结果: str1 = 123 str2 = 345。输出正确

    5、输入控制

    可以在格式化字符串中的"%"各转换指定符之间加入一个整数,表示任意数读取中的最大位数。

    如上例中,若规定只能输入2个字符给字符串数组str1,则需要在第一条更改为:

    #include 

    intmain()

    {

    char*p = NULL;

    charstr1[20],str2[20];

    p = str2;

    scanf("%2s",str1);

    scanf("%s",p);

    printf("str1 = %s\n",str1);

    printf("str2 = %s\n",p);

    return0;

    }

    程序运行时一旦输入字符个数大于2,str1就不再继续读入,而后面的一个读入函数即scanf("%s", p)就会从第3个字符开始读入。

    所以当输入一次输入的字符大于2的时候,剩下的部分会由字符串指针p接收,事实上,就这等于执行第二个scanf语句。所以,如果第一次输入的字符个数大于2,那么按回车之后,程序就会打印了。

    6、多个数值数据

    在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对"%d"输入"12A"时,A即为非法数据)时即认为该数据结束,看下面的例子:

    #include 

    intmain()

    {

    inta;

    scanf("%d",&a);

    printf("after a  = %d\n",a);

    return0;

    }

    输入:12A  输出: after a = 12

    7、字符串数据(%c)问题

    在使用scanf函数的时候,如果格式化字符串指定为"%c",则会将所有输入的字符均认为是有效的字符,看下面程序:

    #include 

    intmain()

    {

    chara,b,c;

    scanf("%c%c%c",&a,&b,&c);

    printf("a = %c,b = %c,c = %c\n",a,b,c);

    return0;

    }

    输入:a(空格)b(空格)c   输出: a = a b = (空格) c = b

    输出并未按照我们的想法输出。

    由于没有指定分割符,所以,在读取输入的时候,scanf将空格也作为一个有效字符进行读取,并赋值给第二个变量。故b的值就是一个空格而已。

    如果加了分割符,如下:

    #include 

    intmain()

    {

    chara,b,c;

    scanf("%c %c %c",&a,&b,&c);

    printf("a = %c,b = %c,c = %c\n",a,b,c);

    return 0;

    }

    输入:a(空格)b(空格)c   输出: a = a b = b c = c

    展开全文
  • #include int main(void) { char fname[40]; char lname[40];... scanf_s("%s", fname); printf("Enter your last name: "); scanf_s("%s", lname); printf("%s, %s\n", lname, fname); return 0; }
  • scanf("%d%d%d%d",a,b,c,d); a=(a+9)%10; b=(b+9)%10; c=(c+9)%10; d=(d+9)%10; printf("The encrypted number is %d%d%d%d\n",c,d,a,b); return 0; } ![图片说明]...
  • 解释:为什么scanf被跳过或执行

    万次阅读 多人点赞 2018-07-14 21:52:01
    ),可能会经常莫名遇到“啥我的第二个scanf()函数自动跳过,等待我输入就自己执行了?”的问题,或者会遇到“啥在我输入数据和回车之后程序没有反应?”,以下是浅薄的解释: 问题一:“啥我的第二个...
  • 为什么scanf要地址

    2021-09-17 13:42:00
    scnaf是赋值类的,需要存入指定的地址 scanf需要修改变量的能力 scanf,传入的参数是值传递,没办法修改到原变量,所以必须要取地址. 简而言之你首先int 了个a。...这就是为什么scanf要地址的原因。 ...
  • scanf函数不能运行(VS2019)(解决方案)

    千次阅读 多人点赞 2021-12-11 10:58:47
    很多同学在出识C语言时大多会遇到scanf不能使用的问题 先上解决方案! 方案一:在每一个scanf后面加_s scanf—>scanf_s scanf_s 方案二:在项目第一行定义_CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO...
  • : 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。 函数名:getchar 功能:从计算机终端(一般是键盘)输入...
  • scanf在VS不能使用的解决办法

    千次阅读 热门讨论 2022-04-10 04:31:47
    scanf返回值被忽略的解决方法(一劳永逸)
  • scanf("%d,%d",&p1->num,&p1->score); fflush(stdin); while(p1->num!=0) { n++; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(struct Student *)malloc(LEN); scanf("%d,%d",&p1->num,&p1->score); ...
  • 在vs中scanf函数中下图的代码正确,但是因为vs中scanf函数被认为安全,现基本改用了scanf_s函数。 #include<stdio.h> int main() { char a[20]; printf("输入一个字符串="); scanf_s("%s",a); } ...
  • 如图:scanf()函数老要输入两次,按回车键盘后还得输入一个数再按回车健,才结束 #include <stdio.h> int main() { int i, b; int result;//函数返回值 scanf("%d ", &i); printf("普通拳!\n"); //...
  • scanf在c++中是scanf_s,因为scanf的标准c库中安全,所以改用更安全的cll库。 方法一:在配置属性->命令行:添加 /D_CRT_SECURE_NO_WORNINGS 方法二:使用标准库cll中的函数...gets不能使用,换gets_s ...
  • scanf输入控制:只能控制长度不能控制精度

    千次阅读 多人点赞 2019-11-12 20:44:50
    例如:现在我们键入一个实数,其整数部分三位,...m),意为输入一个长度6的浮点数,换句话说其只能控制输入的宽度。 这个问题可以参考文章:scanf的控制 再看一个例子: scanf("%5d",&n) printf("%d",n...
  • 编写一个程序,提示用户输入天数,然后将其转换成周数和天数。通过while循环让用户重复输入天数,当用户输入一个非正值,循环结束。(题目来自C Primer Plus 第六版第五章编程练习) #include<stdio.h> int ...
  • scanf()生效?这里有原理及例程给你
  • 由于我觉得scanf输入属实比cin要复杂的多,所以我一直都喜欢用 但是见的多了才发现scanf除了太方便外全是优点,下面列举几个scanf和printf的优点 1.由此题得来 scanf("%d/%d",&a,&b);输入1/2这样的...
  • 在linux系统下,使用scanf函数不能输入空格,所以编者就自己封装了一个EncapScanf函数,希望可以帮助到读者。 #include #include #include int EncapScanf(char *_pcBuffer) //封装输入函数,解决scanf不能...
  • VS2022 scanf()函数不能使用的问题

    千次阅读 2022-01-19 10:05:47
    当代码输入scanf()函数后,发现执行程序时报错 问题描述: 错误 C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_...
  • scanf遇到空格
  • scanf用法—不含非输入控制符2,,,,帮助并了解scanf 注:这是2
  • 结果一查,才知道那个不是控制台,是输出,自然不能scanf了。 配置如下 第一步:搜索Code runner 第二步:打开code runner,然后点击右边设置按钮,点击扩展设置 第三步:选中run in terminal ...
  • C语言中scanf为什么没有执行呀?这里的第二个scanf()为什么没有执行呢?我设置了断点的时候也没有发现它执行。请问各位老师这是什么地方的问题?------解决方案--------------------第二个scanf指定是执行了的,只...
  • scanf用法—不含非输入控制符1,,,帮助并了解scanf 注:这是1
  • vs不能使用scanf

    2021-11-17 00:35:27
    写博原因:由于给新生讲题目用VS2019中编译的时候,遇到了如下问题: ...scanf()函数是标准C中提供的标准输入函数,用以用户输入数据。 scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同
  • 前言 大家都知道在C语言中,有三种主要的输入函数:scanf(),fgets()以及...其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地
  • 由于scanf("%c",&amp;d)这个语句会把回车和空格也当成字符输入进去,所以这个输时一定要注意格式!!输入一个数,加回车时间有两种方法去回车:1.getchar();scanf("%c",&amp;n); //...
  • C/C++语言格式输入函数scanf()详解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 876,466
精华内容 350,586
关键字:

为什么scanf不能输入