【C和指针】第二篇: 快速入门-----知识汇总, 编程练习;
目录
2.2.1.编写程序,从输入读取几行字符,输出时前面加上行号;处理长度没有限制;
2.2.2.标准读取一些字符,写到标准输出上.计算checksum值,并写在字符后面
2.2.3..编写一个程序,一行行的读取输入行,算出每行输入的长度,打印最长行;
2.1章节问题总结:
- C是一种自由形式的语言,没有规则规定他的外观;本章例子里的空白使用,是为了让代码更加具有可读性,良好的代码风格也利于程序正确运行,以及利于后期维护;
- 将声明(函数原型声明)放在头文件中,需要时用 #include 指令包含在源文件里,以后维护和修改更加容易,同时,声明只写一次消除了多份拷贝中出现写法不一致的机会;
- #define 进行字面值常量命名,利于在代码里理解常量表达的意义,并且易于修改;
- printf 中使用格式代码打印十进制整数用%d ;打印字符串%S ;打印浮点值%g;
- 一条scanf语句,读取两个整数,存在quantity和price两变量中,读取一个字符串,存在一个名为department的字符数组中; scanf("%d %d %s ",&quantity,&price,department);
- strcpy() 函数用来复制字符串;其原型为:char *strcpy(char *dest, const char *src);成功执行后返回目标数组指针 dest。
- strcpy() 把src所指的由NULL结束的字符串复制到dest 所指的数组中,返回指向 dest 字符串的起始地址。
- 如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代。
- strncpy()用来复制字符串的前n个字符,其原型为: char * strncpy(char *dest, const char *src, size_t n);
- 不像strcpy(),strncpy()不会向dest追加结束标记'\0',
- 如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
- strncpy 并不帮你保证 \0,如果 s2 的内容比较少,而 n 又比较大的话,strncpy 将会把之间的空间都用 \0 填充;
2.2编程练习:
2.2.1.编写程序,从输入读取几行字符,输出时前面加上行号;处理长度没有限制;
-
#include<stdio.h> #include<stdlib.h> int main(){ int ch; int line; int at_beginning; line = 0; at_beginning = 1; //逐个读取字符。 while ((ch = getchar()) != EOF) { //若处在行的起始位置,打印行号。 if (at_beginning == 1) { at_beginning = 0; line += 1; printf("%d", line); } putchar(ch); if (ch == '\n') at_beginning = 1; } return EXIT_FAILURE; }
运行结果:
-
:
2.2.2.标准读取一些字符,写到标准输出上.计算checksum值,并写在字符后面
- checksum检验用一个singed char 类型变量进行计算,初始值为-1;
- 每个字符标准输入读取时,值就加到checksum中;
- 所有字符军备写入后,程序以十进制整数的形式打印checksun的值,可能是负值;
-
#include<stdio.h> #include<stdlib.h> int main() { char ch; signed char checksum = -1; while ((ch = getchar()) != EOF) { putchar(ch); checksum += ch; if (ch == '\n') { printf_s("%d\n", checksum); checksum = -1; } } return 0; }
运行结果:
-
2.2.3.编写一个程序,一行行的读取输入行,算出每行输入的长度,打印最长行;
- 假定输入行不超过1000;
-
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_LEN 1000 int main() { char input[MAX_LEN];//保存读取行长度 char longest[MAX_LEN];//保存最长行长度 int len; int longest_len; longest_len = -1; printf("请输入数据,以Ctrl+Z结束输入:\n"); while ((gets(input) != NULL)) { len = strlen(input); if (len > longest_len) { longest_len = len; strcpy(longest, input); } } if (longest_len >= 0) puts(longest); printf("%d\n", longest_len); printf("%d\n", longest_len); system("pause"); return EXIT_SUCCESS; }
运行结果:
-
五月的黄昏,
就像是松林的流水,
清澈温柔,影影绰绰;
五月的风里有游子未归的婉转笛声,
五月的晚霞是盛夏的请帖,
你好呀, 初夏时光.