zoukankan      html  css  js  c++  java
  • printf和scanf

    7.#include<stdio.h>
    void fun(int *a)
    {
     *a+=2;
    }
    int main()
    {
     //int i;
     printf("%d\n",fun((int[]){5});//为啥不对,fun(&5)肯定不对,再设变量我知道对
     return 0;
    }


    说一下你的代码,就这么一点代码就有2个错误,这样的代码能编译通过吗?

    1:printf("%d\n",fun((int[]){5}); 少一个括号printf("%d\n",fun((int[]){5}));

    2: fun返回类型是void,却要printf返回数值

    #include<stdio.h>
    int fun(int *a)
    {
            return *a+=2;
    }
    int main()
    {
            //int i;
            printf("%d\n",fun((int[]){5}));
            return 0;
    }

    3.用if(!strcmp(s1,s2))判断两个字符串相等不是好风格


    #define streq(s1,s2) (strcmp((s1),(s2))==0)
    相等返回1,则if(streq(s1,s2))

    4.char c;
    while((c=getchar())!=EOF)

    输出一个%号字符,printf("%%d\n",a);

    5.long int n=12345;
    printf("%ld\n",a);必须用ld,不能是d

    6.不能在printf使用%lf,只能用%f输出double型,但scanf输入却得用%lf


    7.问:如何用printf实现可变的域宽度?就是说,我想在运行时确定宽度而不是使用%8d?

    答:使用printf("%*d", width, x)。格式说明符中的星号表示,参数列表中的一个int值

    用来表示域的宽度。(注意,在参数列表中,宽度在输出的值之前。)


    一直觉得printf很强大,今天又碰到想要格式输出,但是宽度可变怎么办?


    先介绍已知指定宽度的输出。

    char test[] = "manipulations test";

    %s   :printf("%s", test);  //这是最普通的用法

    %ms    :printf("%5s", test)  //输出的字符控制在m个屏幕像素(m=5),但此字符串

    长度大于给定参数,则全部输出。若长度不够,则默认右对齐。

    %-ms   :printf("%-5s", test)  //与上相同,但是左对齐

    %m.ns  :printf("%100.5s", test)  //占m个屏幕像素(m=100),取字符串左端n个字符

    (n=5)输出,右对齐。

    %-m.ns :printf("%-100.5s", test)  //同上,左对齐


    如果宽度需要在程序中待定,那么还可以这样用。

    m = 5;

    printf("%*s", m, test);  //这里用*表示系数待定,m即为指定的宽度。

    n = 4;

    printf("%*.*s", m, n, test)  //功能与上面介绍的常量控制相同。


    8.short int s;
    scanf("%d",&s);//必须用%hd

    %d%d%d既可以1 2 3,又可以
    1
    2
    3;

    #include<stdio.h>
    int main()
    {
     int n;
     scanf("%d\n",&n);
     printf("%d\n",n); 
     return 0;
    }

    9.scanf和gets混用,几乎一定会带来问题
    int n;
    char str[80];
    printf("Input a num:");
    scanf("%d",&n);
    printf("Input a string:");
    gets(str);
    printf("You input %d and %s\n",n,str);
    输入
    42
    a string
    scanf会读取42,但其后的换行符会被留在字符流中,被gets读取一个空行,后面的a

    string不会被处理。
    但若输入42 a string,。则正常

    举一些例子:
    对于 const char* p = "12232114687ABC12356";
    sscanf(p,"%[123]",buf); // 就把是'1'或'2'或'3'的字读读到buf中,直到遇到一个不是'1'且不是'2'且不是'3'的字符,于是执行后buf应该是"1223211";
    %[123]等同于%[231],等同于%[321]……,列表中的顺序是无所谓的;
    %[123]也等同于%[1-3]或%[3-1],也就是“1至3”,对于连续的字符列表这样写就很简单,比如%[a-z]等同%[abc…省略…z];
    想想看,%[3-14]应该等同于什么?是“3至14”吗?当然不是,因为[]中的是字符,而不是数字,所以%[3-14]应该等同于%[3214],等同于%[1234];
    同理,想只取字母,那就可以写成%[A-Za-z];
    如果列表的第一个字母是^,那么正好相反,比如%[^A-Za-z]的意思就是取字母之外的所有字符。
    对于字符串"abDEc123"如果想按照字母和数字读到两个字符串中就应该是 "%[a-zA-Z]%[0-9]",buf1,buf2 ;
    假如我想取一行字符,该怎么办?"%s"是不行的,因为%s遇到空白字符(空格、制表符、\r、\n)就结束了,所以可以写成 "%[^\n]%*c",%[^\n]的作用刚才讲过了,就是读\n之外的所有字符,也就是说读到\n为止,%*c的作用就是把\n去掉,否则再次读的时候一直遇到的都是\n;
    所有对%s起作用的控制,都可以用于%[],比如"%*[^\n]%*c"就表示跳过一行,"%-20[^\n]"就表示读取\n前20个字符。

     即scanf不管\n

    %s%*c

    b不管空格

    %[^\n]

  • 相关阅读:
    ASE19团队项目 beta阶段 model组 scrum report list
    ASE19团队项目 beta阶段 model组 scrum7 记录
    ASE19团队项目 beta阶段 model组 scrum6 记录
    ASE19团队项目 beta阶段 model组 scrum5 记录
    ASE19团队项目 beta阶段 model组 scrum4 记录
    ASE19团队项目 beta阶段 model组 scrum3 记录
    ASE19团队项目 beta阶段 model组 scrum2 记录
    ASE19团队项目 beta阶段 model组 scrum1 记录
    【ASE模型组】Hint::neural 模型与case study
    【ASE高级软件工程】第二次结对作业
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2405185.html
Copyright © 2011-2022 走看看