您的位置:首页 > 编程语言 > C语言/C++

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

2013-05-01 15:24 387 查看

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

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐