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
*/
相关文章推荐
- 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- 写给自己,梳理一下我现在对前端知识结构的理解
- 归纳出自己的知识体系架构才能够更好的理解所学
- 如果你是一个合格的程序员或者你认为自己应该是计算机科学家
- 摘要:我们经常会用到递归函数,但是如果递归深度太大时,往往导致栈溢出。而递归深度往往不太容易把握,所以比较安全一点的做法就是:用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程,相当精彩。本文翻译了这篇文章,并加了自己的一点注释和理解。
- 自己对C语言中scanf语句接受字符串的一点理解
- 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解(转载)
- C语言的容易遗忘的基础知识
- 平时碰到的各种感觉难以理解或者容易混淆的概念的总结-持续
- 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- 学习知识,自己研究才能获得新的理解
- 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- IOS 中viewDidLoad和loadView的关系,个人认为比较容易理解的
- c语言中函数返回局部变量的指针(一些容易犯错的地方)
- 如果你是合格的程序员或者你认为自己是计算机科学家
- C语言需要注意的基础知识点(自己总结的)
- 谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)
- 自己容易搞错的java基础知识汇总
- 自己在学习Mybits的时候理解的一点sql注入的知识,以及处理的方法!
- 关于C语言基本元素的相关问题自己的理解