C语言自己认为理解有难度的或者容易犯错的知识

1.getchar  来自CPP  尼玛这个想了好几天才想通睡觉

#include<stdio.h>
#include<limits.h>
#include<float.h>
int main(void)
{
    char ch;
    ch=getchar();//事实上getchar putchar不是函数,他们只是宏。
    while(ch!='\n')//getchar()参数来自【输入设备的下一个字符】。他们被暂时放在缓冲区中
    {
        if(ch==' ')
            putchar(ch);
        else
            putchar(++ch);
          ch=getchar();
    }    
    putchar(ch);

    char bh;//上面程序的简化形式
    while((bh=getchar())!='\n')
        putchar(++bh);
    putchar(bh);//打印换行符
    return 0;
}


2.数据表示  来自CPP

#include<stdio.h>
#include<limits.h>
#include<float.h>
int main(void)
{
    int x=100;
    printf("x=%d=%o=%x\n",x,x,x);
    printf("x=%d=%#o=%#x\n",x,x,x);
    printf("x=%20d=%-20d\n",x,x);
    printf("x=%020d=%-20d\n",x,x);

    float y=0.00000145486548;
    printf("sizeof float=%u\n",sizeof(float));
    printf("y=%g=%Lf=%e=%.9f=%.f=%0.f=%6.2f\n",y,y,y,y,y,y);//%g %G 说明符根据数值自动选择%e 或者 %f
    printf("%%\n");//打印一个百分号


    char ch,dh;
    scanf("%c",&ch);
    printf("%c\n",ch);
    scanf(" %c",&dh);
    printf("%c\n",dh);


    unsigned width,pre;
    int num=2568415;
    scanf("%u",&width);
    printf("the num is %*d\n",width,num);//printf中%*d用程序指定字段宽度
    
    int m;
    scanf("%*d %*d %d",&m);//跳过2个整数注意最后为%d,其余为%*d,把第三个结果赋给m.
    printf("the last integer is %d\n",m);

    int v;
    scanf("%*s %d",&v);//跳过字符串注意最后为%d,其余为%*s,把第2个结果赋给v
    printf("the number is %d\n",v);
    return 0;
}
/*
x=100=144=64
x=100=0144=0x64
x=                 100=100
x=00000000000000000100=100
sizeof float=4
y=1.45487e-006=0.000001=1.454865e-006=0.000001455=0=0=  0.00
%
258
2
5
the num is  2568415
3
9
23
the last integer is 23
qwertyuiop 25
the number is 25
Press any key to continue
*/


3.循环基本控制。。自己苦想出来的  来自cPP习题

#include<stdio.h>
int main(void)
{
    char ch;
    puts("enter a character");
    while(scanf("%c",&ch)==1)
    {
        for(char tc='A';tc<=ch;tc++)
        {
            for(char i=tc;i<ch;i++)
            {
                printf(" ");
            }


            for(char j='A';j<=tc;j++)
            {
                printf("%c",j);
            }
            for(char k=tc-1;k>='A';k--)
                printf("%c",k);

            printf("\n");
        }
    }
    return 0;
}
/*
enter a character
Z
                          A
                        ABA
                       ABCBA
                      ABCDCBA
                     ABCDEDCBA
                    ABCDEFEDCBA
                   ABCDEFGFEDCBA
                  ABCDEFGHGFEDCBA
                 ABCDEFGHIHGFEDCBA
                ABCDEFGHIJIHGFEDCBA
               ABCDEFGHIJKJIHGFEDCBA
              ABCDEFGHIJKLKJIHGFEDCBA
             ABCDEFGHIJKLMLKJIHGFEDCBA
            ABCDEFGHIJKLMNMLKJIHGFEDCBA
           ABCDEFGHIJKLMNONMLKJIHGFEDCBA
          ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA
         ABCDEFGHIJKLMNOPQPONMLKJIHGFEDCBA
        ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA
       ABCDEFGHIJKLMNOPQRSRQPONMLKJIHGFEDCBA
      ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA
     ABCDEFGHIJKLMNOPQRSTUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA
   ABCDEFGHIJKLMNOPQRSTUVWVUTSRQPONMLKJIHGFEDCBA
  ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA
 ABCDEFGHIJKLMNOPQRSTUVWXYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA

//居然乱了
*/

4.注意变量类型的一致性。容易忽略 来自C与指针

#include<stdio.h>
#include<string.h>
int main(void)
{
    unsigned num1=9,num2=10;
    unsigned cha;
    cha=num1-num2;
    printf("无符号整数运算%d-%d=%d\n",num1,num2,cha);

    char str1[]="dfdfgdd";
    char str2[]="fdfdjfsijfdi";
    if(strlen(str1)-strlen(str2)>=0)//此表达式永远为真
        printf("%s\n",str1);    //strlen函数返回值为无符号整数型,永远不会小于03
    return 0;
}

5.信息表示与处理  来自CASPP

#include<stdio.h>
typedef char *  byte_pointer;
void show_bytes(byte_pointer start,int len)
{
    for(int i=0;i<len;i++)
        printf("%.2x\n",start[i]);
    printf("\n");
}
void show_int(int x)
{
    show_bytes( (byte_pointer)&x,sizeof(int) );
}
void show_float(float x)
{
    show_bytes( (byte_pointer)&x,sizeof(float) );
}


int main(void)
{
    int value=12345;
    show_int(value);
    show_float(12345.0);

    int valu=0x87654321;
    show_bytes((byte_pointer)&valu,1);
    show_bytes((byte_pointer)&valu,2);
    show_bytes((byte_pointer)&valu,3);

    int x=-7;// -1;
    unsigned int u=5;//2147483648;
    printf("%u \t %d\n",x,x);
    printf("%u\t%d\n",u,u);
    printf("%u",x+u);
    return 0;
}


6.strcat的用法 来自CPP。。看书不认真导致之前理解错误

#include<stdio.h>
#include<string.h>
#define SIZE 100
int main(void)
{
    char des[SIZE];
    char add[]="hello boys and girls";
    char *ptr;

    puts("what are you going to say");
    gets(des);
    ptr=strcat(des,add);//strcat只负责把第二个字符串加到第一个字符串【结尾】并返回第一个参数的值,即第一个参数添加第二个参数后的字符串的第一个字符的地址
    printf("%p   %c\n",ptr,*ptr);
    puts(des);
    puts(add);

    char name[SIZE];
    puts("what is your name");
    gets(name);
    printf("nice name %s\n",name);

    return 0;
}
/*
what are you going to say
baby
0018FEE4   b
babyhello boys and girls
hello boys and girls
what is your name
wang qing song\n
nice name wang qing song\n
Press any key to continue
*/

7.再一次理解函数调用本质 来自C与指针

#include<stdio.h>
#define N_VALUES 5
void jiaohuan(int *a,int *b);
int main(void)
{
    int value[N_VALUES];
    int *ptr_value;
    for(ptr_value=value;ptr_value<&value[N_VALUES];)//这样可读性强***
        *ptr_value++=0;/*
    **C保证最后一个数组元素之后的内存位置有效,但是不能对他进行间接访问即不能得出:value[N_VALUES]
    **C不保证对第一个元素之前那个内存位置有效
    即下面这个程序循环次数未知
    for(ptr_value=&value[N_VALUES-1];ptr_value>=&value[0];)//这样可读性
        *ptr_value--=0;
    //ptr_value>=&value[0]这个值是未定义的,前面那个指针已经越界,并且为无效值
    */
    int num1=1;
    int num2=2;
    printf("%p\t%p\n",&num1,&num2);
    jiaohuan(&num1,&num2);
    /*
    **函数都是按值传递的,传递什么,什么就不改变。但是对其进行的间接访问则会生效
    */
    printf("%d\t%d\n",num1,num2);//因此函数调用过后num1,num2值改变,但是其地址不改变
    printf("%p\t%p\n",&num1,&num2);
    return 0;
}
void jiaohuan(int *a,int *b)
{
    int temp=*a;
    *a=*b;
    *b=temp;
}

8.少见输出。。。来自C与指针

#include<stdio.h>
int main(void)
{
    puts("??(");//显示[
    puts("\???");//可以解决三个问号不显示
    printf("%c",'abc');//多字节字符常量,不同环境结果不一样,不具有移植性
    return 0;
}


9.字符串相关。。来自CPP

#include<stdio.h>
#define MAX 81
int main(void)
{
    char name[MAX];
    char full[MAX*2];
    puts("what is your name");
    
    gets(name);//gets()函数读取换行符之前的(除了换行符)所有字符,并在其后加空字符\0.读取换行符并将其丢弃

    fputs(name,stdout);//第二个参数说明要写的文件,不添加换行符
    puts(name);//自动添加换行符

    puts("what is your name again");

    fgets(name,MAX,stdin);//最大读入字符数,为n,最多读取n-1个字符或者读完一个换行符。不丢弃换行符。第三个参数说明读取哪一个文件

    puts(name);

    sprintf(full,"%swelcome to here",name);
    puts(full);

    char sign='asdg';//只低的一字节,字符常量被存储在一个int中
    printf("%c\n",sign);
    

    return 0;
}
/*
what is your name
王青松】
王青松】王青松】
what is your name again
未来路
未来路

未来路
welcome to here
g
Press any key to continue
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值