每日一语:
int i = 3;这句在内存中怎么存???含义??
变量名i与变量值3,内存中占一定的存储单元。
变量值3 在内存中是以二进制保存的,数值以补码表示。即数值在计算机中是以二进制补码保存的。
正数的补码与原码相同;
负数的补码:怎么求?除符号位各位取反,尾数加1。。。。。。
下面这个程序是通过使用数组方式来实现上节中:
统计各个数字、空白符、其他字符出现的次数。。。
1 #include <stdio.h> 2 /*统计各个数字、空白符、其他字符出现的次数*/ 3 int main() 4 { 5 while(1) 6 { 7 int i,c,space,other; 8 int digit[10]; 9 space = other =0; 10 for(i=0;i<10;i++) 11 digit[i]=0;//用数组来保存数字0~9 12 while((c=getchar())!=EOF) 13 { 14 if(c>='0' && c<='9') /*here must char because getchar is meaning ascii value*/ 15 ++digit[c-'0']; //c-'0' 数组的下标代表 数字0,1,2,3。。。 16 else if(c==' ' || c=='\t' || c=='\n') 17 ++space; 18 else 19 ++other; 20 } 21 printf("digit = \n"); 22 for(i=0;i<10;i++) 23 { 24 printf("%d ",digit[i]); //int digit[i] 代表出现数字i的次数 25 } 26 printf("%d %d",space,other); 27 } 28 return 0; 29 }
下面来分析一个具体程序:
1 #include <stdio.h> 2 3 #define MAXLINE 1000 /* maximum input line size */ 4 5 int getline(char line[], int maxline); 6 void copy(char to[], char from[]); 7 8 /* print longest input line */ 9 int main(void) 10 { 11 int len; /* current line length */ 12 int max; /* maximum length seen so far */ 13 char line[MAXLINE]; /* current input line */ 14 char longest[MAXLINE]; /* longest line saved here */ 15 16 max = 0; 17 18 while((len = getline(line, MAXLINE)) > 0) 19 { 20 printf("%d: %s", len, line); 21 22 if(len > max) 23 { 24 max = len; 25 copy(longest, line); 26 } 27 } 28 if(max > 0) 29 { 30 printf("Longest is %d characters:\n%s", max, longest); 31 } 32 printf("\n"); 33 return 0; 34 } 35 36 /* getline: read a line into s, return length */ 37 int getline(char s[], int lim) 38 { 39 int c, i, j; 40 41 for(i = 0, j = 0; (c = getchar())!=EOF && c != '\n'; ++i) 42 { 43 if(i < lim - 1) 44 { 45 s[j++] = c; 46 } 47 } 48 if(c == '\n') 49 { 50 if(i <= lim - 1) 51 { 52 s[j++] = c; 53 } 54 ++i; 55 } 56 s[j] = '\0'; 57 return i; 58 } 59 60 /* copy: copy 'from' into 'to'; assume 'to' is big enough */ 61 void copy(char to[], char from[]) 62 { 63 int i; 64 65 i = 0; 66 while((to[i] = from[i]) != '\0') 67 { 68 ++i; 69 } 70 }
这个程序本身很小,也很简单,但是有两个知识点我想在这里记录下:
(1)上述程序行也声明了getline函数的返回值类型为int。
由于函数的默认返回类型为int,因此这里的int可以省略。
(2)getline函数把字符'\0'(即空字符,其值为0)插入到它创建的数组的末尾,以标记字符串的结束。这一约定已被C语言采用:
当在C中出现类似于:"hello\n"
的字符串常量时,它将以字符数组的形式存储,数组的各元素分别存储字符串的各个字符,并以'\0'标志字符串的结束。

printf函数中的格式规范%s规定,对应的参数必须是以这种形式表示的字符串。
理解清楚字符数组,才能在C语言大胆的使用字符串常量。
练习1-19:编写函数reverse(s),将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序
1 #include <stdio.h> 2 #define MAX_LINE 1024 3 4 5 void reverse(char s[]); 6 int getline(char s[],int len); 7 8 9 //获取一行字符串并返回其长度 10 11 int getline(char s[],int len) 12 { 13 int c,i; 14 for(i=0;i<len-1&&(c=getchar())!=EOF&&c!='\n';i++) 15 { 16 s[i]=c; 17 } 18 if(c=='\n') 19 s[i++]=c; 20 s[i]='\0'; 21 return i; 22 } 23 24 /* 25 reverse函数先要找到字符串s的末尾,然后从'\0'倒退一个位置, 26 27 这样可以保证颠倒后得到的字符串的第一个字符不会成为一个字符串结束符。 28 29 如果从'\0'倒退一个位置后遇到的是一个换行符'\n', 30 31 那就再倒退一个位置,因为换行符也像'\0'一样必须出现在行的末尾。 32 */ 33 34 void reverse(char s[]) 35 { 36 int i=0; 37 int j; 38 char temp; 39 while(s[i]!='\0') //去除'\0' 40 i++; 41 --i; 42 if(s[i]=='\n') //去除'\n' 43 --i; 44 j=i; 45 for(i=0;i<j;i++) 46 { 47 temp=s[i]; 48 s[i]=s[j]; 49 s[j--]=temp; 50 51 } 52 } 53 54 int main() 55 { 56 57 char line[MAX_LINE]; 58 while(getline(line,sizeof line)>0) 59 { 60 reverse(line); 61 printf("%s",line); 62 } 63 64 return 0; 65 }
结束。。。。
自从看到一个命令在我的手下,蹦的一下------------我就笑了
浙公网安备 33010602011771号