精华内容
下载资源
问答
  • 是取地址,scanf读取变量的时候,参数需要的是变量的实际内存地址。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include 。在有一些实现中,printf函数与scanf函数在使用时可以不...

    &是取地址,scanf读取变量的时候,参数需要的是变量的实际内存地址。

    与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include 。

    在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include 。是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

    642207ceef9be1aab8f30d08d929227f.png

    扩展资料:

    对于字符串数组或字符串指针变量,由于数组名可以转换为数组和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。

    可以在格式化字符串中的"%"各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。scanf函数中没有类似printf的精度控制。如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数。

    scanf中要求给出变量地址,如给出变量名则会出错,如 scanf("%d",a);是非法的,应改为scanf("%d",&a);才是合法的。

    展开全文
  • 在解释标题的用法之前,先看看其他的用法。 不知道你有没有看到过scanf下面这样... printf("%s\n",a); return 0; } 上面的代码什么意思呢?试一下几个输入输出: 示例0: 输入:13579 输出:13579 示例1: 输入:121a

    在解释标题的用法之前,先看看其他的用法。
    不知道你有没有看到过scanf下面这样的用法:

    // 来源:公众号【编程珠玑】
    // 作者:守望先生
    #include<stdio.h>
    int main(void)
    {
        char a[128] = {0};
        scanf("%[0-9]",a);
        printf("%s\n",a);
        return 0;
    }
    

    上面的代码什么意思呢?试一下几个输入输出:
    示例0:

    输入:13579
    输出:13579
    

    示例1:

    输入:121abc
    输出:121
    

    示例2:

    输入:shouwang123nb455
    输出:
    

    注意:这里输出不是123,如果想要输出123怎么办?请看后面丢弃特定字符部分。

    看到这里,估计你已经看清套路了,没错,[0-9]表示scanf只读取0-9的字符,而如果遇到不在该范围内的字符,则停止,不再继续读取,就是前面我们看到的示例情况了。

    scanf的[

    scanf函数中,有一个不常被人注意的,就是[了。它用来扫描特定的字符集。如果它以^开头,表示扫描除了字符集以外的所有字符,否则就是前面我们看到的,只扫描读取指定字符。

    scanf读取空字符

    我们都知道,scanf在读取内容的时候,会跳过空字符,比如:

    char s[128] = {0};
    scanf("%s",s);
    printf("%s\n",s);
    

    假设输入为:

        bianchengzhuji
    

    那么输出将会是:

    bianchengzhuji
    

    注意,前面的空字符并没有读入到字符串s中,而是被跳过了。

    那如果要读取空字符怎么办?很简单:

    scanf("%[^\n]",s);
    

    这里的意思就是说,除了换行符,其他字符都读入,也就是说前面的空字符也会被读取,就达到了我们的目的了。

    忽略开头的换行符

    如果我们一开始就按回车,你会发现,s什么都没有读入,如何忽略开始的换行呢?像下面这样就可以了:

    // 来源:公众号【编程珠玑】
    // 作者:守望先生
    #include<stdio.h>
    int main(void)
    {
        char a[10] = {0};
        scanf("%*[\n]%[^\n]",a);
        printf("%s\n",a);
    }
    

    输入输出示例:

    输入:[回车][回车]abc
    输出:abc
    

    输入时,按下两次回车,再输入其他字符,则最终会读取其他字符,而忽略开头的回车换行。我们知道,在scanf中,*是跳过相应的字符项,比如,跳过开头的两个数字:

    // 来源:公众号【编程珠玑】
    // 作者:守望先生
    #include<stdio.h>
    int main(void)
    {
        int third = 0;
        scanf("%*d %*d %d",&third);
        printf("%d\n",third);
        return 0;
    }
    

    输入:

    111 222 333
    

    输出:

    333
    

    scanf会跳过前面的111和222,则会读取333,这个功能在读取文件获取特定列内容的时候很有用。同理,在前面的例子中%*[\n]即表示跳过换行,[^\n]则读取任意字符,直到遇到换行。

    丢弃特定字符

    最开始的例子中,如果开头是字母,即便想读取数字,也读取不到,那么如何跳过开头的字母呢?仿照刚刚讲的:

    // 来源:公众号【编程珠玑】
    // 作者:守望先生
    #include<stdio.h>
    int main(void)
    {
        char a[128] = {0};
        scanf("%*[a-zA-Z]%[0-9]",a);
        printf("%s\n",a);
        return 0;
    }
    

    这样,开头的字母就会被丢弃。

    读取指定长度的任意字符

    char s[8] = {0};
    scanf("%7s",s);
    

    输入:

    abcdefghij
    

    输出:

    abcdefg
    

    这样可以避免缓冲区溢出。

    总结

    scanf是我们刚开始学习C就会接触的函数,除了基本的用法,今天的用法你是否曾经见过呢?

    scanf读取内容会跳过开头的空白字符,遇到换行符或者不是目标字符时结束读取。当然,你不是没有办法,今天所分享的就是办法。当然了,很多时候,你可能会选择使用fgets,getchar之类的函数,无妨。

    问题

    // 来源:公众号【编程珠玑】
    // 作者:守望先生
    #include<stdio.h>
    int main(void)
    {
        int a = 0;
        int b = 0;
        scanf("%d%d",&a,&b);
        printf("%d %d\n",a,b);
        return 0;
    }
    

    输入:

    abcd1234
    

    输出会是什么?为什么?

    原文地址:https://www.yanbinghu.com/2020/12/12/46629.html

    来源:公众号【编程珠玑】

    展开全文
  • WA:在屏幕上可以出现正确的结果,不知为何不能AC #include<stdio.h> #include<stdlib.h> #include<cstring> int main() { char str1[1001],str2... while(scanf("%s %s",str1,str2)!=EO...

    WA:在屏幕上可以出现正确的结果,不知为何不能AC

    #include<stdio.h>
    #include<stdlib.h>
    #include<cstring>
    int main()
    { 
         char str1[1001],str2[1001];
        
         while(scanf("%s %s",str1,str2)!=EOF)
         {
           int a[1001],a1=0,b[1001],b1=0,c[1001],c1=0;
           int i,j;
           for (i=0;str1[i]!='\0';i++)
              a[a1++]=str1[i]-'0';
              a[a1]='\0'; 
           for(j=0;str2[j]!='\0';j++)
              b[b1++]=str2[j]-'0';
              b[b1]='\0';
           int t=0;//代表进位 
           for (i=a1-1,j=b1-1;i>=0&&j>=0;i--,j--)
               {
                     c[c1++]=(a[i]+b[j]+t)%10;
                     t=(a[i]+b[j]+t)/10; 
               }
         int p;
           if (i>=0) //证明a数组有剩余
           {
               p=t;
               for (i=i;i>=0;i--)
                 {
                     c[c1++]=(a[i]+p)%10;
                     p=(a[i]+p)/10; 
                 }
           } 
           if (j>=0)  //证明b数组有剩余
           {
             p=t;
               for (j=j;j>=0;j--)
                 {
                     c[c1++]=(b[j]+p)%10;
                     p=(b[j]+p)/10; 
                 }
           } 
           c[c1++]=p;
           c[c1]='\0';
           int k=c1-1;
           while(c[k]==0) k--;
           for (k=k;k>=0;k--)
             printf("%d",c[k]);
           printf("\n");
           
         }    
         return 0;
          
    }

    大神的AC代码:

    /*
        时间:2014.1.16.22.00
        目的:大数求和 
    */
    #include <stdio.h>
    #include <string.h>
    
    char a[1001],b[1001];
    int c[1001];
    
    int main()
    {
        int carr,len_a,len_b,i,j,temp,len;
        while(~scanf("%s %s", a, b))
        {
            carr = len =0;
            len_a = strlen(a);
            len_b = strlen(b);
            for(i = len_a - 1,j = len_b - 1;i >= 0 && j >= 0;i--, --j)
            {
                temp = a[i] - '0' + b[j] - '0' + carr;
                c[len] = temp % 10;
                carr = temp / 10;
                len++;
            }  
            while(i >= 0)
            {
                temp = carr + a[i] - '0';
                c[len] = temp % 10;
                carr = temp / 10;
                i--;
                len++;
            }
        //    carr&&(c[len] = carr)&&(++len);此处我重复了一次 导致WA  因为当输出8 4 时  输出为112,多输出了一个1 
            while(j >= 0)
            {
                temp = carr + b[j] - '0';
                c[len] = temp % 10;
                carr = temp / 10;
                j--;
                len++;
            }
            carr&&(c[len] = carr)&&(++len);//这到底是什么什么意思???????
            for(--len;len>=0;--len)
            printf("%d", c[len]);
            printf("\n");
        }
        return 0;
    } 
    /*
    输出结果: 
    ---------------------
    2 6                                            思路: 1.由于数很大,必须用字符串存取 
    8                                                   2.注意a,b串是从大高位到低位存储,故数字的最低位在串的最高位        
    10000000000000000000 100000000000000000000000000000003.c串的输出时高位到低位的输出 
    10000000000010000000000000000000
    ---------------------
    */ 

     

    转载于:https://www.cnblogs.com/jianrenguo/p/6538630.html

    展开全文
  • #include<stdio.h> void f(int k) {char a[26]={'A','B','C','D','E','F','G','H', 'I','J','K','L','M','N','O','P', 'Q','R','S','T','U','V','W','X','Y','Z'};... scanf("%d",&n); f(n); }
  • scanf("%d",&a[i]); } for(i=0;i;i++){ for(j=i+1;j;j++){ if(a[i]>a[j]){ tmp=a[j]; a[j]=a[i]; a[i]=tmp; } } } // s=a[0]; for(i=0;i;i++){ s=(double)s/2+(double)...
  • hdu2216 Game III (BFS)

    2011-11-26 12:53:00
    我实在是无语了,为什么一定要用scanf("%s",map[i])或者 gets(map[i]),我用scanf("%c",map[i][j]) 就wa了n次还是错 改了之后,一次就A了 题目的意思比较好理解,就是Z占据了主导权,S一直跟着Z做反方向的运动,若S...

    我实在是无语了,为什么一定要用scanf("%s",map[i])或者 gets(map[i]),我用scanf("%c",map[i][j]) 就wa了n次还是错

    改了之后,一次就A了

    题目的意思比较好理解,就是Z占据了主导权,S一直跟着Z做反方向的运动,若S遇到墙,则原定不动。

    这题目是一个比较基础的BFS吧,只需要用一个四维的数组标记俩个人的状态

    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<math.h>
    using namespace std;
    bool vis[25][25][25][25];
    int si,sj,ei,ej,n,m,ans;
    char g[25][25];
    int dir1[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    int dir2[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
    struct state
    {
    	int x1,x2,y1,y2;	
    	int cnt;
    	state(int a=0,int b=0,int c=0,int d=0,int e=0):x1(a),y1(b),x2(c),y2(d),cnt(e){} 
    };
    queue<state> Q;
    void BFS()
    {
    	vis[si][sj][ei][ej]=true;
    	Q.push(state(si,sj,ei,ej,0));
    	state tmp;
    	while(!Q.empty())
    	{
    		tmp=Q.front();
    		Q.pop();
    		if((abs(tmp.x1-tmp.x2)==1&&tmp.y1==tmp.y2)||(tmp.x1==tmp.x2 && abs(tmp.y1-tmp.y2)==1)||(tmp.x1==tmp.x2&&tmp.y1==tmp.y2))
    		{
    			ans=tmp.cnt;
    			return ;
    		}
    		for(int k=0;k<4;k++)
    		{
    			int i=tmp.x1+dir1[k][0];
    			int j=tmp.y1+dir1[k][1];
    			int l=tmp.x2+dir2[k][0];
    			int c=tmp.y2+dir2[k][1];
    			if(i>=n||i<0 || j>=m || j<0)
    				continue;
    			if(g[i][j]=='X')
    				continue;
    			if(l>=n||l<0 || c>=m || c<0)
    				l=tmp.x2,c=tmp.y2;
    			else if(g[l][c]=='X')
    				l=tmp.x2,c=tmp.y2;
    			if(!vis[i][j][l][c])
    			{
    				vis[i][j][l][c]=true;
    				Q.push(state(i,j,l,c,tmp.cnt+1));
    			}
    		}
    	}
    
    }
    int main()
    {
    	while(scanf("%d %d",&n,&m)==2)
    	{
    		getchar();
    		for(int i=0;i<n;i++)
    		{	
    			gets(g[i]);
    			//getchar();
    			for(int j=0;j<m;j++)
    			{
    			//	scanf("%c",&g[i][j]);就这里让我wa了n次
    				if(g[i][j]=='Z')
    					si=i,sj=j,g[i][j]='.';
    				if(g[i][j]=='S')
    					ei=i,ej=j,g[i][j]='.';
    			}
    		}
    		while(!Q.empty())
    			Q.pop();
    		memset(vis,false,sizeof(vis));
    		ans=-1;
    		BFS();
    		if(ans==-1)
    			puts("Bad Luck!");
    		else printf("%d\n",ans);
    	}
    	return 0;
    }
    	
    

     

    转载于:https://www.cnblogs.com/nanke/archive/2011/11/26/2264220.html

    展开全文
  • scanf("%d",&n); for(i=0;i;i++) scanf("%d",&a[i]); p=fun(a,n); printf("%d\n",p); for(i=0;i;i++) printf("%d ",a[i]); return 0; } int fun(int *a,int s) { while(*(a+s-1)==0) s--; int i,j,t=s; ...
  • scanf_s("%d", &j); } int main(void) { double a = 0, b = 0, c = 0; double A = 0, B = 0, C = 0; double delta = 0; double x1 = 0, x2 = 0; char ch =0; printf("请输入一元二次方程的三个系数...
  • scanf("%s",a); # sscanf(a,"%lf",&tmp); # sprintf(b,"%.2lf",tmp); # int flag=0; # for(j=0;j(a);j++){ # if(a[j]!=b[j]) flag=1; # } if(flag||tmp||tmp>1000){ printf("ERROR: %s...
  • scanf("%s",s); printf("为用户设置密码: "); scanf("%s",d); strcpy(z.a,s); strcpy(z.b,d); fprintf(p,"%s %s",z.a,z.b); fclose(p); } if(t==0) { printf("请输入用户名: "); scanf("%s",s); ...
  • scanf("%s",&b[100]); while(a[i]!='\0') { i++; } while(a[j]!='\0') { a[i+j]=b[j]; j++; } a[i+j]='\0'; printf("%s",a[100]); return 0; } ``` 18|warning: format '%s' expects ...
  • // 来源:公众号【编程珠玑】 ... printf("%s\n",a); return 0; } 上面的代码什么意思呢?试一下几个输入输出:       示例0:输入:13579      &n
  • scanf_s("%d", "%d" ,& a, &b); z = max(a,b); printf("%d", z); } int max(int a, int b) { if (a > b)return a; else return b; } ``` 警告内容为: > 警告 C6328 大小不匹配: 已将“char”作为 ...
  • scanf ( "%s%s", b1, b2 ); /*输入两个高精度数据 */ an = strlen( b1 ); /*an纪录b1的位数 */ bn = strlen( b2 ); /*bn纪录b2的位数 */ if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号 */ if(b2[0]...
  • scanf("%s",str1); printf("Input deleted string:"); scanf("%s",str2); len2 = strlen(str2); while(p = strstr(str1,str2)) { strcpy(p,p+len2); } printf("result string:%s\n",str1); } 这是一道删除 子串的...
  • ** scanf("%s", a[i]);**//这里的a[i]是什么意思,a已经定义成二维数组了,是省略了行长度吗?默认行长度是0? for(i=0;i;i++){ sum=0; for(j=0;j<17 && a[i][j]-'0'>=0 && a[i][j]-'0';j++){ sum+=b[j]*(a...
  • COJ 1281qianshou的集合

    2013-10-10 14:00:01
    这题有点神,以前一直没理解什么意思…… #include int a[1111]; ... while (scanf("%d",&n)!=EOF) { printf("%d\n",qian(n)); } return 0; } int qian(int n) { int i,s; if(a[n]>0)
  • ="|"&"|"^"|"|"|"&"|"||"|"+="|"-="|"*="|"/="|"%="|">>="|"<<="|"&="|"^="|"|="|"=" {printf("%s,NULL\n",yytext);} {id} {printf("ID,%s\n",yytext);} {digit}({letter})+ {printf("error1:%s\n",yytext);} %% #...
  • 第1章 声明和初始化 基本类型 1.1 我该如何决定使用哪种整数类型? 1.2 为什么不精确定义标准类型的大小? 1.3 因为C语言没有精确定义类型的大小,所以我一般都...printf("Youtyped\"%s\"\n",answer);  7.2 我的...
  • scanf("%d%d%d",&a,&b,&c); if(a>b){ pmax=&a; pmin=&b;} else{ pmax=&b; pmin=&a;} if(c>*pmax) pmax=&c; if(c<*pmin) pmin=&c; printf("max=%d\nmin=%d\n",*pmax,*pmin); } ...... pmax,pmin为整型指针变量。 ...
  • printf("%d\n", i++ * i++); 打印出49。不管按什么顺序计算,难道不该是56吗? 62 3.3 对于代码int i=3; i=i++; 不同编译器给出不同的i值,有的为3,有的为4,哪个是正确的? 63 *3.4 有这样一个巧妙的表达式:a^...
  • printf("%d\n", i++ * i++); 打印出49。不管按什么顺序计算,难道不该是56吗? 62 3.3 对于代码int i=3; i=i++; 不同编译器给出不同的i值,有的为3,有的为4,哪个是正确的? 63 *3.4 有这样一个巧妙的表达式:a^...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    printf("%dnn", i++ * i++); 返回49?不管按什么顺序计算, 难道不该打印出56吗? . . . . . . 13 3.3 对于代码int i = 3; i = i++; 不同编译器给出不同的结果, 有的为 3, 有的为4, 哪个是正确的? . . . . . . . . ...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    printf("%d\n",i++*i++);打印出49。不管按什么顺序计算,难道不该是56吗? 3.3 对于代码inti=3;i=i++;不同编译器给出不同的i值,有的为3,有的为4,哪个是正确的? *3.4 有这样一个巧妙的表达式:a^=b^=a^=b;它...
  • printf("You typed \"%s\"\n", answer); o 8.2 我的 strcat() 不行.我试了 char *s1 = "Hello, "; char *s2 = "world!"; char *s3 = strcat(s1, s2); 但是我得到了奇怪的结果。 o 8.3 但是 strcat 的手册页说它...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    printf("%d\n", i++ * i++); 打印出49。不管按什么顺序计算,难道不该是56吗? 33  3.3 对于代码int i=3; i=i++; 不同编译器给出不同的i值,有的为3,有的为4,哪个是正确的? 34  *3.4 有这样一个巧妙的...
  • printf("%d\n",i++*i++);打印出49。不管按什么顺序计算,难道不该是56吗? 3.3 对于代码inti=3;i=i++;不同编译器给出不同的i值,有的为3,有的为4,哪个是正确的? *3.4 有这样一个巧妙的表达式:a^=b^=a^=b;它...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

scanf("%s",a);什么意思