一、設計並測試一個函數,能夠從輸入讀取n個字符(包括空格、製表符和換行符),把結果存儲在一個數組中,這個數組的地址經過參數來傳遞。git
#include<stdio.h> void input(char *p,int n); int main(void) { char a[81]; int n; puts("Input the number of the string."); scanf("%d",&n); getchar(); /*濾去回車*/ puts("Input the string."); input(a,n); puts(a); return 0; } void input(char *p,int n) { int i; for(i=0;i<n;i++) *(p+i)=getchar(); *(p+i)='\0'; }
二、修改並測試練習1中的函數,使得能夠在n個字符後,或第一個空格、製表符、換行符後中止讀取輸入,由上述狀況中最早被知足的那個終止讀取(不能使用scanf()函數)。數組
#include<stdio.h> #include<ctype.h> void input(char *p,int n); int main(void) { char a[81]; int n; puts("Input the number of the string."); scanf("%d",&n); getchar(); /*濾去回車*/ puts("Input the string."); input(a,n); puts(a); return 0; } void input(char *p,int n) { int i; for(i=0;i<n;i++) { *(p+i)=getchar(); if(isspace(*(p+i))) /*利用isspace()判斷輸入是不是空格、製表符或者換行符*/ break; } *(p+i)='\0'; }
三、設計並測試一個函數,其功能是讀取輸入行裏的第一個單詞到數組,並丟掉該 行中的其餘字符。一個單詞的定義是一串字符其中不含空格、製表符或換行符。函數
#include<stdio.h> #include<ctype.h> void word(char *p); int main(void) { char a[81]; puts("Input the string."); gets(a); word(a); puts(a); return 0; } void word(char *p) { int begin,end; for(begin=0;isspace(*(p+begin));begin++) continue; for(end=begin;!isspace(*(p+end));end++) continue; *(p+end)='\0'; for(;*(p+begin)!='\0';p++) *p=*(p+begin); *p='\0'; }
四、設計並測試一個函數,其功能 是搜索由函數的第一個參數指定的字符串,在其中查找由函數的第二個參數指定的字符的第一次出現的位置。若是找到,返回指向這個字符 的指針:若是沒找到,返回空字符(這種方式和strchr()函數的功能同樣)。在一個使用循環語句爲這個函數提供輸入的完整程序中進行測試。測試
#include<stdio.h> char *mystrchr(char *p,char ch); int main(void) { char a[81]; char b; char *p; do{ puts("Input a string:"); gets(a); puts("Input the char you want to find in the string:"); b=getchar(); getchar(); p=mystrchr(a,b); if(p) { puts("Find!"); puts(p); } else puts("Can't find!"); puts("Input any char except q to quit."); gets(a); } while(*a!='q'); puts("Quit."); return 0; } char *mystrchr(char *p,char ch) { char *p_save=p; if(*p=='\0') return NULL; while(1) { if(*p==ch) { return p_save; } else { if(*++p=='\0') return NULL; p_save=p; } } }
五、編寫一個函數is_within()。它接受兩個參數,一個是字符,另外一個是字符串指針。其功能 是若是字符 在字符串中,就返回一個非0值(真);若是字符不在字符串中,就返回0值(假)。在一個使用循環語句爲這個函數提供輸入的完整程序中進行測試。ui
#include<stdio.h> int is_within(char ,char *); int main(void) { char str[81]; char ch; do { puts("Input range string:"); gets(str); puts("Input match char "); ch=getchar(); getchar(); if(is_within(ch,str)) puts("Find!"); else puts("Can't find!"); puts("Input any char except q to go on :"); ch=getchar(); getchar(); } while(ch!='q'); puts("Quit!"); return 0; } int is_within(char ch ,char *p) { while(*p!='\0') { if(*p==ch) return 1; p++; } return 0; }
六、strncpy(s1,s2,n)函數從s2自制n個字符給s1,並在必要時截斷s2或爲其填充額外的空字符。若是字符串長度等於或大於n,目標字符串就沒有標誌結束的空字符。函數返回s1。本身編寫這個函數,並在一個使用循環語句爲這個函數提供輸入的完整程序中進行測試。spa
#include<stdio.h> char *mystrncpy(char *p1,char *p2,int n); int main(void) { char str1[81]; char str2[81]; int n; do { puts("Input string1:"); gets(str1); puts("Input string2:"); gets(str2); puts("Input the number of copying string:"); scanf("%d",&n); getchar(); puts("After copying:"); puts(mystrncpy(str1,str2,n)); puts("Input any char except q to go on."); gets(str1); } while(*str1!='q'); puts("Quit!"); return 0; } char *mystrncpy(char *p1,char *p2,int n) { char *p=p1; while(*p1++ != '\0') continue; *--p1 = *p2; n--; while(n>0 && *p2!='\0') { *++p1 = *++p2; n--; } return p; } /* #include <stdio.h> char *mystrncpy(char *p1, char *p2, int n); int main(void) { char str1[81]; char str2[81]; int n; do { puts("input string1:"); gets(str1); puts("input string2:"); gets(str2); puts("input the number of copying char:"); scanf("%d",&n); getchar(); puts("After copying:"); puts(mystrncpy(str1, str2, n)); puts("input any char except q to go on."); gets(str1); } while(*str1 != 'q'); puts("Quit."); return 0; } char *mystrncpy(char *p1, char *p2, int n) { char *p=p1; while(*p1++ != '\0') continue; *--p1 = *p2; n--; while(n>0 && *p2 != '\0') { *++p1 = *++p2; n--; } return p; } */
七、編寫一個函數string_in(),它接受兩個字符串指針參數。若是第二個字符串被包含在第一個字符串中,函數就返回被包含的字符串開始中的地址。例如,string_in("hats","at")返回hats中a的地址,不然函數返回空指針。在一個使用循環語句爲這個函數提供輸入的完整程序中進行測試。命令行
#include<stdio.h> char *string_in(char *,char *); int main(void) { char str1[81]; char str2[81]; char *p; do { puts("Input the range string:"); gets(str1); puts("Input the match string:"); gets(str2); p=string_in(str1,str2); if(p) { puts("Find!"); puts(p); } else puts("Can't find!"); puts("Input any char except q to quit."); gets(str1); } while(*str1!='q'); puts("Quit!"); return 0; } char *string_in(char *p1,char *p2) { char *p1_save=p1,*p2_save=p2; if(*p1=='\0' || *p2=='\0') return NULL; while(1) { if(*p1==*p2) { if(*++p2=='\0') return p1_save; if(*++p1=='\0') return NULL; } else { if(*++p1=='\0') return NULL; p1_save=p1; p2=p2_save; } } }
八、編寫一個函數,其功能是使輸入字符串反序。在一個使用循環語句爲這個函數提供輸入的完整程序中進行測試。設計
#include<stdio.h> void reverse(char *p); int main(void) { char str[81]; do { puts("Input a string:"); gets(str); reverse(str); puts(str); puts("Input any char except q to go on."); gets(str); } while(*str!='q'); puts("Quit!"); return 0; } void reverse(char *p) { int i,n; char temp; for(n=0;*(p+n)!='\0';n++) continue; n--; for(i=0;i<n-i;i++) { temp=p[i]; p[i]=p[n-i]; p[n-i]=temp; } }
九、編寫一個函數。其參數爲一個字符串,函數刪除字符串中的空格 。在一個能夠循環讀取的程序中進行測試,直到用戶輸入空行。對於任何輸入字符串,函數都應該適用並能夠顯示結果。指針
#include<stdio.h> void del_space(char *); int main(void) { char str[81]; do { puts("Input a string:"); gets(str); del_space(str); puts("After delete space:"); puts(str); puts("Input any char except null line to go on:"); gets(str); } while (*str!='\0'); puts("Quit!"); return 0; } void del_space(char *p1) { char *p2; while(*p1!='\0') { if(*p1==' ') { p2=p1; while(*p2!='\0') { *p2=*(p2 + 1); p2++; } p1--; //抵消下面的p1++; } p1++; } }
十、編寫一個程序,讀取輸入,直到讀入了10個字符串或遇到了EOF,由兩者中最早知足的那個終止讀取過程。這個程序能夠爲用戶提供一個有5個選項的菜單:輸出初始字符串列表、按ASCII順序輸出字符串、按升序遞增順序輸出字符串、按字符串中第一個單詞的長度輸出字符串和退出。菜單能夠循環直到用戶輸入退出請求。固然,程序要能真正完成菜單中的各項功能。code
#include <stdio.h> #include <string.h> #include <ctype.h> void origin_put(char **p,int n); void ascii_put(char **p,int n); void length_put(char **p,int n); int first_word_length(char *p); void word_put(char **p,int n); int main(void) { char str[10][81]; char *p[10]; char command[10]; int n; while (1) { n=0; puts("input no more than 10 strings finished by EOF (^Z):"); do { if(gets(str[n])==NULL) break; p[n] = str[n]; n++; } while(n<10); puts("select:"); puts("a. put originally"); puts("b. put in order by ascii"); puts("c. put in order by string's length"); puts("d. put in order by first word's length"); puts("e. input string again"); puts("q. Quit"); do { gets(command); switch(command[0]) { case 'a': puts("put originally"); origin_put(p,n); break; case 'b': puts("put in order by ascii"); ascii_put(p,n); break; case 'c': puts("put in order by string's length:"); length_put(p,n); break; case 'd': puts("put in order by first word's length:"); word_put(p,n); break; case 'e': break; default : puts("Quit."); return 0; } } while (command[0]!='e'); } } void origin_put(char **p,int n) { int i; for(i=0;i<n;i++) puts(p[i]); } void ascii_put(char **p,int n) { int i,j; char *temp; for(i=0;i<n;i++) for(j=0;j<n-i-1;j++) if(strcmp(p[j],p[j+1])>0) { temp=p[j]; p[j]=p[j+1]; p[j+1]=temp; } origin_put(p,n); } void length_put(char **p,int n) { int i,j; char *temp; for(i=0;i<n;i++) for(j=0;j<n-i-1;j++) if(strlen(p[j])>strlen(p[j+1])) { temp=p[j]; p[j]=p[j+1]; p[j+1]=temp; } origin_put(p,n); } int first_word_length(char *p) { int i=0; for(; !isalpha(*p); p++) if(*p=='\0') return 0; for(i=1;isalpha(p[i]);i++) continue; return i; } void word_put(char **p,int n) { int i,j; char *temp; for(i=0;i<n;i++) for(j=0;j<n-i-1;j++) if(first_word_length(p[j]) > first_word_length(p[j+1])) { temp=p[j]; p[j]=p[j+1]; p[j+1]=temp; } origin_put(p,n); }
十一、編寫一個程序。功能是讀取輸入,直到遇到EOF,並報告單詞數、大寫字母數、小寫字母數、標點符號數和數字字符數。使用ctype.h系列的函數。
#include<stdio.h> #include<ctype.h> int main(void) { int word=0,upper=0,lower=0,punct=0,digit=0,begin=0; char ch; while((ch=getchar())!=EOF) { if(isalpha(ch)) { if(begin==0) { word++; begin=1; } } else begin=0; if(isupper(ch)) upper++; if(islower(ch)) lower++; if(ispunct(ch)) punct++; if(isdigit(ch)) digit++; } printf("word:%d\nupper:%d\nlower:%d\npunct:%d\ndigit:%d\n",word,upper,lower,punct,digit); return 0; }
十二、編寫一個程序,按照相反的單詞順序顯示命令行參數。即,若是命令行參數是see you later,程序的顯示應該爲leter you see。
#include<stdio.h> #include<string.h> #include<ctype.h> int main(void) { char str[81]; char *p,temp; int i,n,length; gets(str); for(p=str,i=0,n=strlen(str);i<n/2;i++) //將整個字符串倒序 { temp=*(p+n-1-i); *(p+n-1-i)=*(p+i); *(p+i)=temp; } puts(str); p=str; length=0; do //將字符串中的每一個單詞倒序 { if(isalpha(*p)) { length++; } else { if(length>1) for(i=0;i<length/2;i++) { temp=*(p-1-i); *(p-1-i)=*(p-length+i); *(p-length+i)=temp; } length=0; } } while(*p++ != '\0'); puts(str); return 0; }
1三、編寫一個計算乘冪的基於命令行的程序。第一個命令行參數爲double類型數,做爲冪的底數;第二個參數爲整數,做爲冪的指數。
#include <stdio.h> double mypower(double base,int exp); int main() { double base; int exp; printf("input base number and exp:"); scanf("%lf%d",&base,&exp); printf("%g^%d = %g\n",base,exp,mypower(base,exp)); return 0; } double mypower(double base,int exp) { double power=1; if(exp<0) power=1/mypower(base,-exp); else if (exp>0) while(exp-->0) power *= base; else if(base!=0) power=1; else power=1/base; //0的0次冪是一個無心義的數 return power; }
1四、使用字符分類函數實現atoi( )函數。
#include <stdio.h> #include <stdlib.h> #include <ctype.h> double myatof(char *p); int main(void) { char a[30]={0}; while(a[0] != 'q') { puts("input a double without +-e:"); gets(a); printf("atof: %.5lf\n",atof(a)); printf("myatof: %.5lf\n",myatof(a)); printf("difference:%.5lf\n", atof(a)-myatof(a)); puts("input any char except q to go on."); gets(a); } puts("Quit."); return 0; } double myatof(char *p) //將字符串轉換爲浮點型,暫時只限小數點格式 { double n=0; int i=-1; while(1) { if(isdigit(*p)) //若是是數字 { n=n*10+(*p)-'0'; if(i != -1) i++; //小數位數計數 } else if (*p == '.' && i==-1) //若是是第一個小數點 i=0;//開啓小數位數i計數 else break; p++; } for(;i>0;i--) //根據小數位數i,將n取值爲原來的(10^i)分之五 n/=10; return n; }
1五、編寫一個程序,其功能是讀取輸入,直到遇到文件結尾,並把文件顯示出來。要求程序能夠識別並執行下面的命令行參數:
-p 按照原樣顯示輸出
-u 把輸入所有轉換爲大寫
-l 把輸入所有轉換成小寫
#include <stdio.h> #include <ctype.h> int main(int argc,char *argv[]) { char ch; if(argv[1][0] == '-') if(argv[1][1]='u') while((ch=getchar())!=EOF) putchar(toupper(ch)); else if(argv[1][1]='l') while((ch=getchar())!=EOF) putchar(tolower(ch)); else if(argv[1][1]='p') while((ch=getchar())!=EOF) putchar(ch); return 0; }