日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
*/

總結

以上是生活随笔為你收集整理的C语言自己认为理解有难度的或者容易犯错的知识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。