k&r c
阅读的中文版第二版
P13页代码 记行数:
#include <stdio.h>
/* count lines in input */
main()
{
int c, nl;
nl = 0;
while ((c = getchar()) != EOF)
if (c == '\n')
++nl;
printf("%d\n", nl);
}
getchar(),单独一行只接受一个字符,若是在循环里面写,可以接受一个队列,所以若是每输入一个字符就按回车,则换行符总是在下一个循环里面被获取。
#include <stdio.h>
int main(){
int c,nl,n,pre;
nl=0;
n=0;
while((c = getchar()) != EOF){
n++;
if (c=='\n')
++nl;
if (c!='\n')
printf("%c\n",c);
pre=c;
}
printf("\n");
printf("EOF:%d\n",EOF);
printf("倒数第二个字符:%c,%d\n",pre,pre);
printf("最后一个字符:%c,%d.\n",c,c);
printf("换行符的个数:%d\n",nl);
printf("接收的字符总字数:%d\n",n);
return 0;
}
10是换行符的ascii码。-1是EOF的识别码
fprintf在向文本文件写内容时,最后最好加一个'\n',不然cat读不出来,是不是cat的bug?vim可以读
数组下标还能这么玩
連續聲明的變量是相鄰的,並且由於堆棧的關係,棧頂的地址比棧底的地址位置要低。所以也騙過了strlen函數的檢測機制。
同樣
\的方式會記住下一行的tab間隔,"xxx" "xxxx"沒有這種問題。(截圖和部分筆記來自網易慕課浙大翁恺老師的C語言課程)
在前面表示指针指向的变量不能修改,在后面表示指针的值不能被修改
指针减法,type *a,*b..;//a-b == (a存的地址-b存的地址)/sizeof(type)
如果int* q得到了char* p的地址,则*q=0会导致p[0]到p[3]都是0
第二种初始化的方法,没显式赋值的会填0;
如果代码里有连续的用到输入函数,比如scanf
接收的如果是字符,则敲下回车后'\n'会自动传给下一个scanf函数,解决方法是清空输入缓冲区,rewind(stdin);
如果是接收的其他类型,则没有这种问题,因为'\n'也算是字符吧
或者干脆上一个scanf,字符串参数的末位加一个\n,可能解决问题。
“0”的ascii码是48
A的ascii码是65,a是97,NULL是0