c 语言程序设计现代方法:13章习题自己编答案(持续更新)
第一部分:練習(xí)題
3.
#include <stdio.h> int main() { int i; char s[100]; int j; scanf("%d%s%d",&i,s,&j); printf("i 's value:%d\n",i); printf("s 's value:%s\n",s); printf("j 's value:%d\n",j);return 0; } ~輸出結(jié)果:
12abc34 56def78 i 's value:12 s 's value:abc34 j 's value:56注意:scanf函數(shù)以空白自負(fù)作為分界,或者遇到第一個不合理的字符結(jié)束。
4.
(a)如果定義(在定義第一個scanf()的時候,%c前面加一個空格,那么讀取第一個字符的時候就會跳過前面的空格,后面的空格不跳過)
/*4.(a)*/ /* -------- excape space characters in the beginning------------ */ #include <stdio.h> #include <stdbool.h> #include <ctype.h> #define LEN 100 size_t read_line(char *p,int n); void print_(char *,int n); int main() {char arr[LEN];read_line(arr,LEN);printf("%s",arr);return 0; }size_t read_line(char *p,int n) { int cnt = 0; char ch; //這里%c前面有個空格,讀取第一個字符的時候就會跳過所有空白 scanf(" %c",&ch); while(ch != '\n'){if(cnt < n){*p ++ = ch;cnt ++; } scanf("%c",&ch); } //不要忘記最后加上'\0',否則最后無法正常打印 *p = '\0'; //返回字符串的長度,不算結(jié)尾的'\0'的長度return cnt; }~ ~?
/*4.(a)*/ /* -------- excape space characters in the beginning------------ */ #include <stdio.h> #include <stdbool.h> //isspace()函數(shù)需要<ctype.h>頭文件 #include <ctype.h> #define LEN 100 size_t read_line(char *p,int n); void print_(char *,int n); int main() {char arr[LEN];read_line(arr,LEN);printf("%s",arr);return 0; }size_t read_line(char *p,int n) { int cnt = 0; int ch; ch = getchar(); bool label = false; while(ch != '\n'){ // isspace()判斷一個字符是否是空白字符,如果是返回true,否則返回falseif(!isspace(ch)){label = true;}if(cnt < n && label == true){*p ++ = ch;cnt ++; }ch = getchar(); } //最后一定要給字符串結(jié)尾加上'\0',如果不加,打印或者使用的時候可能不正常 *p = '\0'; //返回字符串長度,不算結(jié)尾的'\0'的長度 return cnt; }或者可以按照下面方法忽略開始的空白
/*4.(a)*/ /* -------- excape space characters in the beginning------------ */ #include <stdio.h> #include <stdbool.h> #include <ctype.h> #define LEN 100 size_t read_line(char *p,int n); void print_(char *,int n); int main() {char arr[LEN] = {'\0'};read_line(arr,LEN);printf("%s",arr);return 0; }size_t read_line(char *p,int n) {int ch,i = 0;while((ch = getchar()) != '\n'){//當(dāng)i == 0 且 ch 為空白字符,那么直接忽略if(i == 0 && isspace(ch));else if(i < n){p[i ++] = ch; } } //添加結(jié)尾的'\0'字符p[i] = '\0';return i;}?
綜上所述,忽略空白的時候,我們可以設(shè)置一個標(biāo)志,標(biāo)志從遇到第一個非空白字符時候設(shè)置為真,以后均為真。或者可以采用scanf()的%c前面加空格方法也可以。
4(b)
這個程序還是跳過最前面的空白,但是不跳過中間空白,中間遇到空白時候立刻結(jié)束
/*4.(b)*/ /* -------- excape space characters in the beginning------------ */ #include <stdio.h> #include <stdbool.h> #include <ctype.h> #define LEN 100 size_t read_line(char *p,int n); void print_(char *,int n); int main() {char arr[LEN];read_line(arr,LEN);printf("%s",arr);return 0; }size_t read_line(char *p,int n) { int cnt = 0; char ch; //這里%c前面有個空格,讀取第一個字符的時候就會跳過所有空白 scanf(" %c",&ch); //當(dāng)ch 不等于換行符 以及空白符時候才執(zhí)行 while(ch != '\n' && !(isspace(ch))){if(cnt < n){*p ++ = ch;cnt ++; } scanf("%c",&ch); } *p = '\0';return cnt; }?下面程序不跳過開始空白,但是跳過中間空白
/*4.(b)*/ /* -------- excape space characters in the beginning------------ */ #include <stdio.h> #include <stdbool.h> #include <ctype.h> #define LEN 100 size_t read_line(char *p,int n); void print_(char *,int n); int main() {char arr[LEN];read_line(arr,LEN);printf("%s",arr);return 0; }size_t read_line(char *p,int n) { int cnt = 0; char ch; //設(shè)置一個標(biāo)志,這個標(biāo)志為真意味著已經(jīng)讀取過非空白字符 bool have_char = false; //這里%c前面有個空格,讀取第一個字符的時候就會跳過所有空白 while((ch = getchar()) != '\n'){//當(dāng)ch是非空白字符時,設(shè)置have_char 為trueif(!isspace(ch)) have_char = true;//當(dāng)ch 是空白,而且have_char為真(已經(jīng)之前讀取過非空白字符),那么循環(huán)結(jié)束if(isspace(ch) && have_char)break;else if(cnt < n){p[cnt ++] = ch; }} p[cnt] = '\0';return cnt; }評論:上面的程序的特點是,必須至少讀取一個非空白字符,否則程序不可能結(jié)束。畢竟它是可能會導(dǎo)致程序無法結(jié)束的情況的。
?
下面的程序是,無論在何時遇到空白,立刻結(jié)束:
/* -------- excape space characters in the beginning------------ */ #include <stdio.h> #include <stdbool.h> #include <ctype.h> #define LEN 100 size_t read_line(char *p,int n); void print_(char *,int n); int main() {char arr[LEN];read_line(arr,LEN);printf("%s",arr);return 0; }size_t read_line(char *p,int n) { int ch,i = 0;while(!isspace(ch = getchar()) && ch != '\n'){if(i < n) { *p ++ = ch; ++ i;}} *p = '\0';return i;}到底是一遇到空白就結(jié)束還是,中間遇到空白才結(jié)束,各有千秋吧。
4(c)
開始不跳過空白讀入
#include <stdio.h> #define LEN 100 int read_line(char* ,int); int main() { char arr[LEN]; read_line(arr,LEN); printf("%s",arr);return 0; } int read_line(char* p,int n) { int ch,i = 0; while((ch = getchar()) != '\n'){if(i < n-1){*p ++ = ch; ++ i;} } *p ++ = '\n'; *p = '\0';return i; }開始跳過空白讀入:
#include <stdio.h> #include <ctype.h> #define LEN 100 int read_line(char* ,int); int main() { char arr[LEN]; read_line(arr,LEN); printf("%s",arr);return 0; } int read_line(char* p,int n) { int ch,i = 0; while((ch = getchar()) != '\n'){//if i equals to 0 and ch is a space,nothing to doif(i == 0 && isspace(ch));else if(i < n-1){*p ++ = ch; ++ i;} } *p ++ = '\n'; *p = '\0';return i; }評論:以上主要是當(dāng)i == 0 && isspace(ch) 成立時候,什么也不做。
如果想跳過中間的空白,那么加一個語句就可以:
#include <stdio.h> #include <ctype.h> #define LEN 100 int read_line(char* ,int); int main() { char arr[LEN]; read_line(arr,LEN); printf("%s",arr);return 0; } int read_line(char* p,int n) { int ch,i = 0; while((ch = getchar()) != '\n'){//下面這句就是增加的語句 if(i != 0 && isspace(ch)) break;//if i equals to 0 and ch is a space,nothing to doif(i == 0 && isspace(ch));else if(i < n-1){*p ++ = ch; ++ i;} } *p ++ = '\n'; *p = '\0';return i; }4(d)
#include <stdio.h> #define LEN 10 #define EXTRA_LEN 10 int read_line(char *,int,char *); int main() { //定義存儲字符串的字符數(shù)組 char arr[LEN + 1]; //定義存儲輸入的多余的字符的數(shù)組 char extra_char[EXTRA_LEN + 1]; read_line(arr,LEN,extra_char); printf("char :%s\n",arr); printf("extra char:%s\n",extra_char);return 0; }int read_line(char *p,int n,char *e) { int ch,cnt = 0,cnt_extra = 0; while((ch = getchar()) != '\n') {if(cnt < n){*p ++ = ch;++ cnt; }else if(cnt >= n){if(cnt_extra < EXTRA_LEN){*e ++ = ch;cnt_extra ++;}else{printf("overflow!!!");*p = '\0';*e = '\0';return cnt;}} }*p = '\0';*e = '\0';return cnt; }5.
把一個字符串中小寫字母改成大寫字母,利用toupper()函數(shù),這個函數(shù)定義在 ctype.h 頭文件中
#include <stdio.h> #include <ctype.h> #define LEN 100 void capitalize(char *,int ); int main() { char arr[LEN + 1] = "asdAabdasf*,.PasdfasdfAS1231"; capitalize(arr,LEN + 1); printf("%s",arr);return 0; }void capitalize(char *s,int n) { while(*s != '\0') {if( *s >= 'a' && *s <= 'z'){*s = toupper(*s);}s ++; } }?如果不用 ctype.h中的 toupper函數(shù),那么可以如下:
#include <stdio.h> void capitalize(char *,int ); #define LEN 100 int main() { char arr[LEN + 1] = "asdf as..asdfas..asdfasdfdf"; capitalize(arr,LEN + 1); printf("%s",arr);return 0; } void capitalize(char *s,int n) {for(; *s != '\0';++ s){if(*s >= 'a' && *s <= 'z'){*s -= ('a' - 'A'); }} }6.
把一個字符串中出現(xiàn)的foo替換為xxx
#include <stdio.h> #define LEN 100 void censor(char* ,int ); int main() { char arr[LEN + 1] = "ASDFfooasdfoo123234fooasfoo"; censor(arr,LEN + 1); printf("%s",arr);return 0; }void censor(char *s,int n) {for(;*s != '\0';s ++){if(*s == 'f' && *(s + 1) == 'o' && *(s +2)== 'o'){ *s = 'x';*(s + 1) = 'x';*(s + 2) = 'x';}} } ~7.
假設(shè)str是字符數(shù)組,下面哪條語句與其它3條語句不等價?
(a) *str = 0;(b) str[0] = '\0';(c) strcpy(str,"");(d) strcat(str,"");答案:(d)
(a)是把str所指向的字符設(shè)置為值0,也就是ASC1碼值是0,那當(dāng)然是 '\0'了。所以結(jié)果是? str所指向的字符改變?yōu)?#39;\0'
?(b)所用和上面一樣,str[0]就是str所指向的自符
? ?(c)? 把空字符拷貝給str,所以str得到一個空字符,注意str其它部分沒有變,只有str所指向的自負(fù)變成'\0'了(字符串""就是指的空字符)
? (d) 的作用是,先找到str的第一個空字符,然后把空字符復(fù)制到這個位置。如果str沒有空字符,什么也不做。也就是什么也不做。
前三個選項和str本身內(nèi)容無關(guān),只是把str的第一個字符設(shè)置成空字符,只有(d)項什么也不做。所以答案是d.
9.
#include <stdio.h> #include <string.h> #define LEN 100 int main() { char s1[LEN + 1]; char s2[LEN + 1]; strcpy(s1,"computer"); strcpy(s2,"science"); if(strcmp(s1,s2) < 0)strcat(s1,s2); elsestrcat(s2,s1); s1[strlen(s1) - 6] = 0; printf("%s",s1);return 0; }運行結(jié)果是:
computers
10.這個函數(shù)的錯誤在于返回局部變量的指針。c語言返回局部變量的指針是不可以的。
自己改正后的代碼如下:
#include <stdio.h> #include <string.h> #define LEN 100 char *duplicate(char *,const char *); int main() { char arr1[LEN + 1]; char arr2[LEN + 1] = "abcdef"; strcpy(arr1,arr2); printf("%s\n",arr1); printf("%s\n",arr2); return 0; } char *duplicate(char *q,const char*p) { strcpy(q,p);return q; }?11.
#include <stdio.h> int strcmp(const char*,const char *); int main() { char * p1 = "abcde"; char * p2 = "abc"; printf("result is:%d\n",strcmp(p1,p2));return 0; }int strcmp(const char *s1,const char *s2) { int i = 0; for(;*s1 == *s2;++ i){if(*s1 == '\0'){return 0;}s1 ++;s2 ++;}return (*s1 - *s2); }11題這個循環(huán)不能把 s1++ 和s2 ++放在for循環(huán)內(nèi),否則:如果出現(xiàn)*s1 == *s2,且都等于'\0',那么程序還會遞增兩次才結(jié)束(想想為啥?)。這顯然不是程序本意。
12.
#include <stdio.h> #include <string.h> #define LEN 100 void get_extension(const char *,char *); int main() { char * file1 = "words.txt"; char extension[LEN + 1]; get_extension(file1,extension); printf("%s",extension);return 0; }void get_extension(const char *file_name,char * extension) { //這里雖然指針變量file_name是const的,但是它本身仍然可以改變或者自增,只要不改變它指向的值就可以 for(;*file_name != '\0';++ file_name){if(*file_name == '.')break; } if(!*file_name){ //整數(shù)0就是空字符'\0',這里給字符變量賦值可以直接賦asc11碼值*extension = 0;} elsestrcpy(extension,++ file_name);} ~13.
#include <stdio.h> #include <string.h> void build_index_url(const char *,char *); #define LEN 100 int main() { char arr[LEN + 1]; build_index_url("domain",arr); printf("%s\n",arr);return 0; }void build_index_url(const char *domain,char *index_url) { char *prefix = "http://www."; //postfix or suffix char *suffix = "/index.html"; strcat(strcat(strcpy(index_url,prefix),domain),suffix); } ~13題程序利用了strcpy()、strcat()都返回左側(cè)的字符串的原理編寫的。左側(cè)字符串也就是目的字符串地址。
14.
#include <stdio.h> int main() { char s[] = "Hsjodi",*p; for(p = s;*p; ++ p){--*p;}puts(s); return 0; }15.
#include <stdio.h> int f(char *,char *); int main() { //(a) int r1 = f("abcd","babc"); printf("%d\n",r1); //(b) int r2 = f("abcd","bcd"); printf("%d\n",r2);//(c) //當(dāng)給定s和t的值以后,返回的是s中第一個不在t中的字符的下標(biāo) //本函數(shù)可以用作查找用,類似于c++語言標(biāo)準(zhǔn)庫的函數(shù)find_first_not_of()return 0; }int f(char *s,char *t) { char *p1,*p2; for(p1 =s;*p1;p1 ++) { for(p2 = t;*p2; p2 ++)if(*p1 == *p2)break;if(*p2 == '\0')break; }return (p1 - s); }運行結(jié)果:
3 016.
?
17.
#include <stdio.h> #include <ctype.h> #include <stdbool.h> #define LEN 100 bool test_extension(const char *file_name,const char *extension) { while(*file_name){if(*file_name == '.')break;++ file_name;} file_name ++; for(;*file_name;++ file_name){if(tolower(*file_name) != tolower(*extension)){return false;}++ extension;} if(*extension) return false; else return true;} int main() {char p1[LEN + 1] = "FILE.TXT"; char p2[LEN + 1] = "txT";char p3[LEN + 1] = "rxT";bool r;r = test_extension(p1,p3);printf("%d",r);return 0; }運行結(jié)果:0
18.
#include <stdio.h> #define LEN 100 void remove_filename(char *url) { char *slanting_bar_pos; while(*url){if(*url == '/')slanting_bar_pos = url; ++ url;} *slanting_bar_pos = '\0'; }int main() { char url[LEN] = "http://www.knking.com/index.html"; remove_filename(url); printf("%s",url);return 0; }第二部分:程序設(shè)計題
鏈接? ?https://blog.csdn.net/digitalkee/article/details/113796572
總結(jié)
以上是生活随笔為你收集整理的c 语言程序设计现代方法:13章习题自己编答案(持续更新)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 如何不用decltype获取一个
- 下一篇: AttributeError: ‘str