文章目录
1. 第1题
1.1 题目描述
设计并测试一个函数,从输入中获取下n个字符(包括空白、制表符、换行符),把结果储存在一个数组里,它的地址被传递作为一个参数 。
1.2 编程源码
# include<stdio.h>
void get_char(char *c, int n){
char t;
int i=0;
while((t = getchar())!= EOF && i<n){
c[i] = t;
++i;
}
}
int main(void){
char c[5];
get_char(c, 5);
for(int i= 0;i<5;++i){
putchar(c[i]);
}
return 0;
}
1.3 结果显示
2. 第2题
2.1 题目描述
修改并编程练习1的函数,在n个字符后停止,或在读到第一个空白、制表符或换行符停止 ,哪个先遇到哪个停止。不能只使用scanf();
2.2 编程源码
# include<stdio.h>
# include<ctype.h>
void get_char(char *c, int n){
char t;
int i=0;
while((t = getchar())!= EOF && i<n){
if(isspace(t)) break;
c[i] = t;
++i;
}
}
int main(void){
char c[5];
get_char(c, 5);
for(int i= 0;i<5;++i){
putchar(c[i]);
}
return 0;
}
2.3 结果显示
3. 第3题
3.1 题目描述
设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并丢弃输入行中的其余字符。该函数 应该跳过第一个非空字符前面的所有空白。将一个单词定义为没有 空白、制表符或换行符的租字符序列。
3.2 编程源码
# include<stdio.h>
# include<ctype.h>
void get_char(char *c){
char t;
int i=0;
int flag = 0;
while((t = getchar())!= EOF && t != '\n'){
if(isspace(t) && !flag)continue;
if(isspace(t) && flag)break;
if(isalpha(t) && flag){
c[i] = t;
++i;
}
if(isalpha(t) && flag == 0){
c[i] = t;
++i;
flag = 1;
}
}
c[i+1] = '\0';
}
int main(void){
char c[40];
get_char(c);
printf("%s\n",c);
return 0;
}
3.3 结果显示
4. 第4题
4.1 题目描述
设计并测试一个函数,它类似于编程3的描述,只不过它接受第2个参数指明可读取的最大字符数。
4.2 编程源码
# include<stdio.h>
# include<ctype.h>
void get_char(char *c, int n){
char t;
int i=0;
int flag = 0;
while((t = getchar())!= EOF && t != '\n' && i<n){
if(isspace(t) && !flag)continue;
if(isspace(t) && flag)break;
if(isalpha(t) && flag){
c[i] = t;
++i;
}
if(isalpha(t) && flag == 0){
c[i] = t;
++i;
flag = 1;
}
}
c[i+1] = '\0';
}
int main(void){
char c[40];
get_char(c, 5);
printf("%s\n",c);
return 0;
}
4.3 结果显示
5. 第5题
5.1 题目描述
设计并测试一个函数,搜索第1个 函数形参指定的字符串,在其中查找第2个函数形参指定的字符首次出现的位置。如果成功,则函数返回指向该字符的指针,如果在字符串中未找到指定字符,则返回空指针(该函数的功能与strchr函数相同)。在一个完整的程序中测试该函数,使用一个循环函数提供输入值。
5.2 编程源码
# include<stdio.h>
# include<ctype.h>
char *get_char(char *str, char c){
char *id = NULL;
while(*str != EOF){
if(*str == c){
id = str;
break;
}
++str;
}
return id;
}
int main(void){
char str[] ="dog is runing on the grass\n";
printf("原字符串为:%s\n",str);
char* c = get_char(str, 'o');
if(c != NULL) printf("%c 在该字符串中\n", 'o');
else printf("%c 不在该字符串中\n", 'o');
return 0;
}
5.3 结果显示
6. 第6题
6.1 题目描述
编写一个名为is_within的函数,接受一个字符和一个指向字符串的指针作为两个函数形参。如果指定字符在字符串中,该函数返回一个非零值(即为真)。否则,返回0(即为假)。在一个完整的程序中测试该函数,使用一个循环给函数输入值。
6.2 编程源码
# include<stdio.h>
# include<ctype.h>
int is_within(char *str, char c){
int id = 0;
int i=0;
while(*str != '\0'){
if(*str == c){
id = i ;
break;
}
++str;
++i;
}
return id;
}
int main(void){
char str[] ="dog is runing on the grass\n";
printf("原字符串为:%s\n",str);
char c;
int n;
while((c=getchar())!= EOF && isalpha(c)){
n = is_within(str, c);
printf("%d\n",n);
if(n) printf("%c 在该字符串中\n", str[n]);
else printf("%c 不在该字符串中\n", c);
}
return 0;
}
6.3 结果显示
7. 第7题
7.1 题目描述
strncpy(s1,s2,n)把s2中的n个字符拷贝至s1中,截断s2,或者有必要的话在末尾添加空字符。如果s2的长度是n或多于n,目标字符串不能以空字符结尾。该函数返回s1。自己编写一个这样的函数,名为mystrncpy。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。
7.2 编程源码
# include<stdio.h>
# include<string.h>
void mystrncpy(char *s1, const char* s2, int n){
if(n<=strlen(s2)){
for(int i=0;i<n;++i)*s1++=*s2++;
}else{
while(*s2 != '\0') *s1++=*s2++;
*s1='\0';
}
}
int main(void){
char s1[] ="ab";
char s2[] ="abcdef";
char s[5];
printf("S1原字符串为:%s\n",s1);
mystrncpy(s,s1,5);
printf("S1拷贝字符串为:");
for(int i=0;i<5;++i)putchar(s[i]);
printf("\nS2原字符串为:%s\n",s2);
mystrncpy(s,s2,5);
printf("S2拷贝字符串为:");
for(int i=0;i<5;++i)putchar(s[i]);
return 0;
}
7.3 结果显示
8. 第8题
8.1 题目描述
编写一个名为string_in的函数,接受两个指向字符串的指针作为参数。如果第2个字符串中包含第1个字符串,该函数将返回第1个字符串开始的地址。例如,string_in(“hats”,“at”)将返回hats中的a地址,否则该函数返回空指针。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。
8.2 编程源码
# include<stdio.h>
# include<string.h>
const char* string_in(char *s1,const char* s){
int m = 0;
char* c = NULL;
while(*s != '\0'){
if(*s != s1[m]){
++s;
m = 0;
continue;
}else{
++s;
++m;
if(m == strlen(s1)-1){
c = s-m;
break;
}
}
}
return c;
}
int main(int argc, char** argv){
char s[100];
char s1[10];
const char *c;
puts("请输入你的字符串(空行退出程序):");
while(gets(s)&& gets(s1) && s[1] != '\0' && s[0] != '\0'){
c = string_in(s1, s);
puts(c);
puts("请输入你的字符串(空行退出程序):");
}
return 0;
}
8.3 结果显示
9. 第9题
9.1 题目描述
编写一个函数,把字符串中的内容用其反序字符串代替。在一个完整的程序中测试该函数,使用一个循环提供输入值值。
9.2 编程源码
# include<stdio.h>
# include<string.h>
void string_in(char *s){
char t;
for(int i=0,j = strlen(s)-1;i<j;++i,--j){
t = s[i];
s[i] = s[j];
s[j]= t;
}
}
int main(int argc, char** argv){
char s[100];
puts("请输入你的字符串(空行退出程序):");
while(gets(s) && s[0] != '\0'){
string_in(s);
puts(s);
puts("请输入你的字符串(空行退出程序):");
}
return 0;
}
9.3 结果显示
10. 第10题
10.1 题目描述
编写一个函数接受一个字符串作为参数,并删除字符串中的空格。在一个程序中测试该函数,使用循环读取输入行,知道用户输入一行空行。该程序应该应用该函数只每个输入字符串,并显示处理后的字符串。
10.2 编程源码
# include<stdio.h>
# include<string.h>
# include<ctype.h>
void string_in(char *s){
int m = 0;
for(int i=0;i<strlen(s);++i){
if(isspace(s[i])){
++m;
continue;
}
s[i-m] = s[i];
}
s[strlen(s)-m] = '\0' ;
}
int main(int argc, char** argv){
char s[100];
puts("请输入你的字符串(空行退出程序):");
while(gets(s)&& s[0] != '\0'){
string_in(s);
puts(s);
puts("请输入你的字符串(空行退出程序):");
}
return 0;
}
10.3 结果显示
文本内容:
abc 123 ref 345
11. 第11题
11.1 题目描述
编写一个函数,读入10个字符串或者读到EOF时停止。该程序为用户提供一个有5个选项的菜单:打印源字符串列表、以ASCII中的顺序打印字符串、按长度递增顺序打印字符串、按字符串中第1个单词的长度打印字符串、退出。菜单可以循环显示,除非用户选择退出选项。当然,该程序要能真正完成菜单中各选项的功能。
11.2 编程源码
# include<stdio.h>
# include<string.h>
# include<ctype.h>
void print_a(char *s[10],int n){
for(int i=0;i<n;++i) puts(s[i]);
}
void print_b(char *s[10],int n){
char *t;
for(int i = 0;i<n;++i){
for(int j=i+1;j<n;++j){
if(strcmp(s[i],s[j])>0){
t = s[i];
s[i] = s[j];
s[j] = t;
}
}
}
print_a(s,n);
}
void print_c(char *s[10],int n){
char *t;
for(int i = 0;i<n;++i){
for(int j=i+1;j<n;++j){
if(strlen(s[i])> strlen(s[j])){
t = s[i];
s[i] = s[j];
s[j] = t;
}
}
}
print_a(s,n);
}
int wordlen(const char* s1, const char*s2){
int m = 0;
int n = 0;
while(*s1 != '\0'){
if(!isalpha(*s1++))break;
++m;
}
while(*s2 != '\0'){
if(!isalpha(*s2++))break;
++n;
}
return m-n;
}
void print_d(char *s[10],int n){
char *t;
for(int i = 0;i<n;++i){
for(int j=i+1;j<n;++j){
if(wordlen(s[i],s[j])>0){
t = s[i];
s[i] = s[j];
s[j] = t;
}
}
}
print_a(s,n);
}
void display_menu(void){
puts("*******************************************************************");
puts("a. 打印原字符串 b. 以ASCII中的顺序打印字符串");
puts("c. 按长度递增顺序打印字符串 d. 按字符串中第一个单词的长度打印字符串");
puts("q. 退出");
puts("*******************************************************************");
}
int main(int argc, char** argv){
char s[10][100];
char *ps[10];
int i=0;
puts("请输入你的字符串(数量<=10):");
for(i=0;i<10;++i){
if(gets(s[i]) && s[i][0] == '\0') break;
ps[i] = s[i];
}
char c;
display_menu();
while((c=getchar())!= EOF){
while(getchar() != '\n');
switch(c){
case 'a':puts("a. 打印原字符串");print_a(ps,i);break;
case 'b':puts("b. 以ASCII中的顺序打印字符串");print_b(ps,i);break;
case 'c':puts("b. 按长度递增顺序打印字符串");print_c(ps,i);break;
case 'd':puts("b. 按字符串中第一个单词的长度打印字符串");print_d(ps,i);break;
default:return 0;
}
}
return 0;
}
11.3 结果显示
12. 第12题
12.1 题目描述
编写一个程序,读取输入,直至读到EOF,报告单词数、大写字母数、小写字母数、标点数和数字字符数。使用ctype.h头文件中的函数.
12.2 编程源码
# include<stdio.h>
# include<ctype.h>
int main(int argc, char** argv){
char c;
int word_num = 0;
int up_num = 0;
int low_num = 0;
int pan_num = 0;
int dig_num = 0;
int flag = 0;
while((c=getchar())!=EOF){
if(isupper(c))++up_num;
if(islower(c))++low_num;
if(ispunct(c))++pan_num;
if(isdigit(c))++dig_num;
if(isalpha(c)) flag = 1;
if(flag && !isalpha(c)){
flag = 0;
++word_num;
}
}
printf("单词数:%d\n", word_num);
printf("大写字母数:%d\n", up_num);
printf("小写字母数:%d\n", low_num);
printf("标点数:%d\n", pan_num);
printf("数字数:%d\n", dig_num);
return 0;
}
12.3 结果显示
文档内容:
dog is running on the grass.
dog is eating.
13. 第13题
13.1 题目描述
编写一个程序,反序显示命令行参数单词。例如 第一个 命令行参数是see you later,该程序应该打印 later you see。
13.2 编程源码
# include<stdio.h>
# include<string.h>
int main(int argc, char** argv){
for(int i=strlen(argv[1])-1;i>=0;--i)putchar(argv[1][i]);
putchar('\n');
return 0;
}
13.3 结果显示
14. 第14题
14.1 题目描述
编写一个通过命令行运行的程序计算幂,第一个命令行参数是double类型的数,作为幂的底数,第二个参数是整数,作为幂的指数。
14.2 编程源码
# include<stdio.h>
# include<stdlib.h>
# include<math.h>
int main(int argc, char** argv){
printf("%s 的 %s 次幂为%.2lf\n", argv[1],argv[2],pow(atof(argv[1]),atof(argv[2])));
return 0;
}
14.3 结果显示
15. 第15题
15.1 题目描述
使用字符串分类函数实现atoi函数。如果输入的字符串不是纯数字,该函数返回0.
15.2 编程源码
# include<stdio.h>
# include<ctype.h>
int a2i(const char* s){
int num = 0;
int sum=0;
int f = 1;
while(*s != '\0'){
sum *= 10;
if(!isdigit(*s)){
f = 0;
break;
}
sum = (sum+*s-'0');
++s;
}
if(f) num = sum;
return num;
}
int main(int argc, char** argv){
printf("%s 转换为 %d\n", "123", a2i("123"));
printf("%s 转换为 %d\n", "12d3", a2i("12d3"));
return 0;
}
15.3 结果显示
16. 第16题
16.1 题目描述
编写一个程序读取输入,直至读到文件结尾,然后把字符串打印出来。该程序识别和实现下面的命令行参数:
-p 按原样打印
-u 把输入全部转换成大写
-l 把输入全部转换成小写
如果没有命令行参数,则让程序像是使用了-p参数那样运行。
16.2 编程源码
# include<stdio.h>
# include<ctype.h>
int main(int argc, char** argv){
int n = 1;
char c;
switch(argv[1][1]){
case 'p': n =1;break;
case 'u': n =2;break;
case 'l': n =3;break;
}
while((c=getchar())!=EOF){
if(n == 1) putchar(c);
if(n == 2) putchar(toupper(c));
if(n == 3) putchar(tolower(c));
}
printf("\n Done\n");
return 0;
}
16.3 结果显示
文档内容:
dog is running on the grass.
dog is eating.
运行结果: