C Primer Plus (中文版)第11章编程练习 参考答案(仅供参考~)

C Primer Plus (中文版)第11章编程练习 参考答案(仅供参考~)

🌴 C Primer Plus第11章编程练习~ 加油加油!🍭
🍭感觉这一章,比较吃力~ 很迟没有更新了,也有自己的原因 ~
2023的最后一天啦~ 🌈期待新的一年 2024! 一起闪闪发光~⭐️

☘️欢迎大家讨论 批评指正~

第1题

🍎1.设计并测试一个函数,从输入中获取下n个字符(包括空白、制表
符、换行符),把结果储存在一个数组里,它的地址被传递作为一个参数。

#include<stdio.h>
#include<string.h>
#define N 20
void get(int n,char *data);
int main(void){
    char data[N];
    printf("please enter:");
    get(N,data);
    return 0; 
}
void get(int n,char *data){
    fgets(data,n,stdin);
    fputs(data,stdout);
}

第2题

🍐修改并编程练习1的函数,在n个字符后停止,或在读到第1个空白、制表符或换行符时停止,哪个先遇到哪个停止。不能只使用scanf()。

/*
 * @Description:  修改并编程练习1的函数,在n个字符后停止,或在读到第1个空白、
制表符或换行符时停止,哪个先遇到哪个停止。不能只使用scanf()。
 * @Author: ~光~~
 * @Date: 2023-12-21 16:43:40
 * @LastEditTime: 2023-12-28 18:56:33
 * @LastEditors:  
 */

#include<stdio.h>
#define N 10
void get(char data[],int n);
void get1(char data[],int n);
int main(void){
    char data[N];
    get(data,N);
    return 0; 
}
void get(char data[],int n){
    int i;
    fgets(data,n,stdin);
    printf("the orginal  data are:");
    fputs(data,stdout);
    while(*data!='\n'&& *data!='\0'){
        if(*data=='\t' || *data=='\t' || *data==' ') *data='\0';
        data=data+1;
    }
    printf("\nafter the function the data are:");
    fputs(data-2,stdout);
}//关于指针的都不太会

void get1(char data[],int n){
    int i=0;
    fgets(data,n,stdin);
    printf("the orginal  data are:");
    fputs(data,stdout);
    while(data[i]!='\n'&& data[i]!='\0'){
        if(data[i]=='\t' || data[i]=='\t' || data[i]==' ') data[i]='\0';
        i++;
    }
    printf("\nafter the function the data are:");
    fputs(data,stdout);
}

第3题

🍌设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并
丢弃输入行中的其余字符。该函数应该跳过第1个非空白字符前面的所有空
白。将一个单词定义为没有空白、制表符或换行符的字符序列。

/*
 * @Description:  设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并
丢弃输入行中的其余字符。该函数应该跳过第1个非空白字符前面的所有空
白。将一个单词定义为没有空白、制表符或换行符的字符序列。
 * @Author: ~光~~
 * @Date: 2023-12-21 17:15:53
 * @LastEditTime: 2023-12-28 20:56:27
 * @LastEditors:  
 */
#include<stdio.h>
#include<ctype.h>
void readWord(char *word, int maxLength);


int main() {
    char word[100];  // 假设最大单词长度为100

    printf("请输入一行文本: ");
    readWord(word, sizeof(word));

    printf("读取的单词是: %s\n", word);

    return 0;
}
void readWord(char *word, int maxLength) {
    int c;
    int i = 0;

    // 跳过第1个非空白字符前的空白字符
    while ((c = getchar()) != EOF && isspace(c)) {
        continue;
    }

    // 读取单词直到遇到空白字符或达到数组最大长度
    while (c != EOF && !isspace(c) && i < maxLength - 1) {
        word[i] = c;
        i++;
        c = getchar();
    }

    // 添加字符串结束符
    word[i] = '\0';

   fflush(stdin);
}


第4题

🍑4. 设计并测试一个函数,它类似编程练习3的描述,只不过它接受第2个
参数指明可读取的最大字符数。

/*
 * @Description:  .设计并测试一个函数,它类似编程练习3的描述,只不过它接受第2个
参数指明可读取的最大字符数。
 * @Author: ~光~~
 * @Date: 2023-12-28 20:55:59
 * @LastEditTime: 2023-12-28 20:56:07
 * @LastEditors:  
 */
#include<stdio.h>
#include<ctype.h>
void readWord(char *word, int maxLength);


int main() {
    char word[100];  // 假设最大单词长度为100

    printf("请输入一行文本: ");
    readWord(word, sizeof(word));

    printf("读取的单词是: %s\n", word);

    return 0;
}
void readWord(char *word, int maxLength) {
    int c;
    int i = 0;

    // 跳过第1个非空白字符前的空白字符
    while ((c = getchar()) != EOF && isspace(c)) {
        continue;
    }

    // 读取单词直到遇到空白字符或达到数组最大长度
    while (c != EOF && !isspace(c) && i < maxLength - 1) {
        word[i] = c;
        i++;
        c = getchar();
    }

    // 添加字符串结束符
    word[i] = '\0';

   fflush(stdin);
}

第5题

🌿设计并测试一个函数,搜索第1个函数形参指定的字符串,在其中查找第2个函数形参指定的字符首次出现的位置。
如果成功,该函数返指向该字符的指针,如果在字符串中未找到指定字符,则返回空指针(该函数的功
能与 strchr()函数相同)

/*
 * @Description:  .设计并测试一个函数,搜索第1个函数形参指定的字符串,在其中查
找第2个函数形参指定的字符首次出现的位置。
如果成功,该函数返指向该字符的指针,如果在字符串中未找到指定字符,则返回空指针(该函数的功
能与 strchr()函数相同)。

在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。
 * @Author: ~光~~
 * @Date: 2023-12-28 20:57:42
 * @LastEditTime: 2023-12-29 11:25:47
 * @LastEditors:  
 */
#include<stdio.h>
#include<string.h>
char *find(char *s,char *f);
int main(void){
    char *s="o";
    char *f="nihaohhss";
    char *x;
    printf("outer\n");
    x=find(s,f);
    if (x != NULL) {
        printf("the character is :");
        printf("%c", *x);
    } else {
        printf("Character not found\n");
    }
    return 0; 
}

char *find(char *s, char *f){
    int i=0;
    for(i=0;f[i]!='\0';i++){
        if(f[i]==s[0]) return &f[i];//此时直接返回相应的地址就可以了
    }
    return NULL;
}

第6题

🌺6.编写一个名为is_within()的函数,
1️⃣接受一个字符和一个指向字符串的指针作为两个函数形参。
2️⃣ 如果指定字符在字符串中,该函数返回一个非零值(即为真)。否则,返回0(即为假)。
在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。

/*
 * @Description:  编写一个名为is_within()的函数,
 接受一个字符和一个指向字符串的指针作为两个函数形参。
 如果指定字符在字符串中,该函数返回一个非零值
(即为真)。否则,返回0(即为假)。
在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。
 * @Author: ~光~~
 * @Date: 2023-12-28 21:55:44
 * @LastEditTime: 2023-12-29 11:29:51
 * @LastEditors:  
 */
#include<stdio.h>
#include<string.h>
int is_within(char c,char *p);
int main(void){
    char c='A';
    char *p="nihaoA";
    int t;
    t=is_within(c,p);
    if(t) printf("Specify characters are in the string\n");
    else printf("Specify characters are not in the string\n");
    
    return 0; 
}
int is_within(char c,char *p){
//     如果指定字符在字符串中,该函数返回一个非零值
// (即为真)。否则,返回0(即为假)。
    int i=0;
    while(*p!='\0'){
        if(c==*p) return 1;
        p++;
    }
    return 0;
}

第7题

🚀strncpy(s1, s2, n)函数把s2中的n个字符拷贝至s1中,截断s2,或者有必要的话在末尾添加空字符。如果s2的长度是n或多于n,目标字符串不能以空字符结尾。该函数返回s1。自己编写一个这样的函数,名为mystrncpy()。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。

/*
 * @Description:  strncpy(s1, s2, n)函数把s2中的n个字符拷贝至s1中,截断s2,或者有必
要的话在末尾添加空字符。如果s2的长度是n或多于n,目标字符串不能以空
字符结尾。该函数返回s1。自己编写一个这样的函数,名为mystrncpy()。在
一个完整的程序中测试该函数,使用一个循环给函数提供输入值。
 * @Author: ~光~~
 * @Date: 2023-12-29 11:33:14
 * @LastEditTime: 2023-12-29 12:02:46
 * @LastEditors:  


 strncpy() 函数在复制时,会尽可能复制源字符串的前 n 个字符到目标字符串中。具体处理方式如下:
如果源字符串的长度大于等于 n,则 strncpy() 只会复制源字符串的前 n 个字符到目标字符串中。
目标字符串的剩余部分(如果有的话)不会被改变。如果源字符串的长度小于 n,则 strncpy() 
会先复制源字符串的所有字符,然后用空字符 ('\0') 填充目标字符串的剩余部分,直到达到 n 个字符为止。

如果 dest 原来已经有内容,那么会根据上述规则进行覆盖或追加。如果 dest 原来的内容长度大于等于 n,
则只会覆盖 dest 的前 n 个字符;如果 dest 原来的内容长度小于 n,则会覆盖整个原内容,并在剩余的位置
用空字符 ('\0') 填充。
 */
#include<stdio.h>
#include<string.h>
char *mystrncpy(char *s1,char *s2,int n);
int main(void){
    char s1[10]="nihaoya";
    char s2[10]="hello";
    int n=3;
    char *consolidation;
    
    consolidation=strncpy(s1,s2,n);
   
    printf("%s\n",consolidation);
    return 0; 
}


char *mystrncpy(char *s1,char *s2,int n){
    int len=0;
    len=strlen(s2);
   
    if(len>=n) {
        strncpy(s1, s2, n);
        s1[n]='\0';
        
    }
    else strncpy(s1, s2, n);

    return s1;
}

第8题

🐬 8.编写一个名为string_in()的函数,接受两个指向字符串的指针作为参数。如果第2个字符串中包含第1个字符串,该函数将返回第1个字符串开始的地址。例如,string_in(“hats”, “at”)将返回hats中a的地址。否则,该函数返回空指针。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。

/*
 * @Description:  编写一个名为string_in()的函数,接受两个指向字符串的指针作为参
数。如果第2个字符串中包含第1个字符串,该函数将返回第1个字符串开始的地址。
例如,string_in("hats", "at")将返回hats中a的地址。否则,该函数返
回空指针。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。
 * @Author: ~光~~
 * @Date: 2023-12-29 12:05:39
 * @LastEditTime: 2023-12-29 16:12:03
 * @LastEditors:  
    strcmp()函数比较字符串中的字符,直到发现不同的字符为止,这一过
程可能会持续到字符串的末尾。而strncmp()函数在比较两个字符串时,可以
比较到字符不同的地方,也可以只比较第3个参数指定的字符数。
 */
#include<stdio.h>
#include<string.h>
char *string_in(char *s1,char *s2);
int main(void){
    char *p;
    char *s1="nihaoss";
    char *s2="os";
    p=string_in(s1,s2);
    if(p!=NULL){
        printf("s2 is in s1\n");
        printf("the letter address is %p\n",p);
    }else printf("s2 is not in s1\n");

    return 0; 
}
char *string_in(char *s1,char *s2){
    int t,i=0;
    for(i=0;i<strlen(s1);i++){
        if(strncmp(s1+i,s2,strlen(s2))==0) return s1+i;
       
    }
    return NULL;
}

第9题

🐋9.编写一个函数,把字符串中的内容用其反序字符串代替。在一个完整
的程序中测试该函数,使用一个循环给函数提供输入值。

/*
 * @Description:  编写一个函数,把字符串中的内容用其反序字符串代替。在一个完整
的程序中测试该函数,使用一个循环给函数提供输入值。
 * @Author: ~光~~
 * @Date: 2023-12-29 15:26:06
 * @LastEditTime: 2023-12-29 16:33:29
 * @LastEditors:  
 */
#include<stdio.h>
#include<string.h>
char *reverse(char *s,char *real);
int main(void){
    char *s="nihao";
    char *real;
    printf("before s is %s\n",s);
    real=reverse(s,real);
    printf("after s is %s\n",real);
    return 0; 
}
char *reverse(char *s,char *real){
    
    int i;
    for(i=0;i<strlen(s);i++){
        real[i]=s[strlen(s)-i-1];
    }
    real[i]='\0';

   return real;
}

第10题

🌞10.编写一个函数接受一个字符串作为参数,并删除字符串中的空格。在一个程序中测试该函数,使用循环读取输入行,直到用户输入一行空行。该程序应该应用该函数只每个输入的字符串,并显示处理后的字符串。

#include<stdio.h>
void removeSpaces(char *str);
int main() {
    char inputLine[100];  // 假设输入行的最大长度为 100

    // 循环读取输入行,直到用户输入一行空行
    printf("请输入字符串(输入空行结束):\n");
    while (fgets(inputLine, sizeof(inputLine), stdin) != NULL && inputLine[0] != '\n') {
        // 调用函数删除字符串中的空格
        removeSpaces(inputLine);

        // 显示处理后的字符串
        printf("处理后的字符串: %s\n", inputLine);
    }

    printf("程序结束。\n");

    return 0;
}
// 函数:删除字符串中的空格
void removeSpaces(char *str) {
    int i, j = 0;
    for (i = 0; str[i] != '\0'; i++) {
        if (str[i] != ' ') {
            str[j++] = str[i];
        }
    }
    str[j] = '\0';  // 在新字符串的末尾添加 null 字符
}

第11题

🌈11.编写一个函数,读入 10个字符串 或者读到EOF时停止。该程序为用户提供一个有5个选项的菜单:打印源字符串列表、以ASCII中的顺序打印字符串、按长度递增顺序打印字符串、按字符串中第1个单词的长度打印字符串、退出。菜单可以循环显示,除非用户选择退出选项。当然,该程序要能
真正完成菜单中各选项的功能

/*
 * @Description:  编写一个函数,读入  10个字符串  或者读到EOF时停止。该程序为用
户提供一个有5个选项的菜单:打印源字符串列表、以ASCII中的顺序打印字
符串、按长度递增顺序打印字符串、按字符串中第1个单词的长度打印字符
串、退出。菜单可以循环显示,除非用户选择退出选项。当然,该程序要能
真正完成菜单中各选项的功能
 * @Author: ~光~~
 * @Date: 2023-12-29 18:54:50
 * @LastEditTime: 2023-12-31 11:43:19
 * @LastEditors:  
 */
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define SIZE 4  
#define ROOM 10 
void show(void);
void enter(char s[SIZE][ROOM]);
void print1(char s[SIZE][ROOM]);
void print2(char s[SIZE][ROOM]);
void print3(char s[SIZE][ROOM]);
void print4(char s[SIZE][ROOM]);
int check_words(char s[]);//计算字符串的第一个单词的长度

int main(void){
    int i=0,flag=1;
    int choice;
    char s[SIZE][ROOM];
    //从键盘输入
    printf("Input up to %d lines\n", SIZE);
    enter(s);
    while(flag){
        show();
        printf("please enter your choice:");
        while(scanf("%d",&choice)!=1){
            printf("incorrect type ! please try again!");
            show();
            printf("please enter your choice:");
            fflush(stdin);
        }
        switch(choice){
            case 1:{
                    printf("the function 1\n");
                    print1(s);
                    break;
            }
            case 2:{
                printf("the function 2\n");
                printf("the original characters:\n");
                print1(s);
                    print2(s);
                    break;
            }
            case 3:{
                    printf("the function 2\n");
                    printf("the original characters:\n");
                    print1(s);
                    print3(s);
                    break;
            }
            case 4:{
                    printf("the function 2\n");
                    printf("the original characters:\n");
                    print1(s);
                    print4(s);
                    break;
            }
            default:{
                printf("bye!\n");
                flag=0;
                break;
            }
        }
        
    }
    
    return 0; 
}


void show(void){
    printf("-----------------------------------------------------\n");
    printf("(1)打印源字符串列表\t\t(2)以ASCII中的顺序打印字符串\n");
    printf("(3)按长度递增顺序打印字符串\t(4)按字符串中第1个单词的长度打印\n");
    printf("(5)退出\n");
    printf("-----------------------------------------------------\n");
}
void enter(char s[][ROOM]){
    char c;
    int i,j=0;
    for(i=0;i<SIZE;i++){
        printf("plese enter the %dth character:",i+1);
        fflush(stdin);
        while((c=getchar())!=EOF && (c!='\n')){
            s[i][j]=c;
            j++;
            if(j==ROOM-2){
                printf("====the room is full====\n");
                printf("====I will break=====\n");
                break;
            }
        }
        s[i][j]='\0';
        j=0;

    }
}
void print1(char s[SIZE][ROOM]){
    int i=0;
    for(i=0;i<SIZE;i++){
       printf("the %dth are %s\n",i+1,s[i]);
    }
}

void print2(char s[SIZE][ROOM]){
// 以ASCII中的顺序打印字符串
//采用选择排序法
    int k,i,j,p;
    int max_index;
    char max=s[0][0];
    char tmp;
    for(i=0;i<SIZE;i++){//一共SIZE个数组
        for(k=0;s[i][k]!='\0';k++){//轮次
            max=s[i][k];
            max_index=k;//如果第一个就是最大的话 一定记得要给上一轮循环的max再次覆盖 从头开始
            for(j=k+1;s[i][j]!='\0';j++){//遍历次数
                if(s[i][j]-max>=0){
                    max=s[i][j];//记下最大值的位置
                    max_index=j;
                }
               
            }
           
            tmp=s[i][max_index];
            s[i][max_index]=s[i][k];
            s[i][k]=tmp;
            
        }  
    }
    printf("按ascii顺序打印字符串:\n");
    for(i=0;i<SIZE;i++){
        printf("%s\n",s[i]);
    }
    
    
}

void print3(char s[SIZE][ROOM]){
    // 按长度递增顺序打印字符串
    int i,j=0,k;
    int len[SIZE];
    int min,min_index;
    int index[SIZE];
    int tmp;
    int list[SIZE][2];//建立一个类似于python 中的列表的东西 第一个装的是顺序,第二个装的是对应的长度
    for(i=0;i<SIZE;i++){
        len[i]=strlen(s[i]);
    }
    for(i=0;i<SIZE;i++){
        list[i][0]=i;
        list[i][1]=len[i];
    }//list[i][0]  第i个 0 里面装的是顺序 1里面装的是长度

    for(i=0;i<SIZE;i++){
        min_index=list[i][0];
        min=list[i][1];
        for(j=i+1;j<SIZE;j++){
            if(min>=list[j][1]){
                min_index=list[i][0];
                min=list[j][1];
            }
        }

        for(k=0;k<2;k++){
            tmp=list[i][k];
            list[i][k]=list[min_index][k];
            list[min_index][k]=tmp;

        }
    }

 //    打印list
    printf("按顺序的打印字符串:\n");
    for(i=0;i<SIZE;i++){
        printf("%s\n",s[list[i][0]]);
    }
       
}

int check_words(char s[]){
//计算开始的单词的长度

    int i,j;
    int flag=0;
    int test=0;
    
    for(i=0;i<ROOM;i++){
        if(isalpha(s[i])){
            flag+=1;
    
        }
        else{
            
            if(flag>=1&&test==0) {
     
                return flag;
            }
            if(isalnum(s[i])) test=1; //如果数字和字母混在一起 也不算是一个单词
            else test=0;
            flag=0;
           
        }   
    }
    return 0;
    
}

void print4(char s[SIZE][ROOM]){  
//按字符串中第1个单词的长度打印字符串
    int i,j=0,k=0,z=0;
    int len[SIZE];
    int min,min_index;
    int list[SIZE][2];//建立一个类似于python 中的列表的东西 第一个装的是顺序,第二个装的是对应的长度
    int tmp;
   
    for(i=0;i<SIZE;i++){
        len[i]=check_words(s[i]); //得到每一个SIZE的第一个 单词的长度
      //  printf("len[%d] is %d\n",i,len[i]);
    }

    for(i=0;i<SIZE;i++){
        list[i][0]=i;
        list[i][1]=len[i];
    }//list[i][0]  第i个 0 里面装的是顺序 1里面装的是长度
 
 //开始对list进行排序  list【【0,3】,【1,2】】
    for(i=0;i<SIZE;i++){
       // printf("enter loop\n");
        min_index=list[i][0];
        min=list[i][1];
 //       for(j=i+1;j<SIZE;j++){  注意 会越界 如果加一的话  导致排序不正常 
        for(j=i;j<SIZE;j++){
            if(min>=list[j][1]){
                min_index=j;
                min=list[min_index][1];
            }
        }
        for(k=0;k<2;k++){
            tmp=list[i][k];
            list[i][k]=list[min_index][k];
            list[min_index][k]=tmp;
        }  
    }

 //    打印list
    printf("按第一个单词的长度打印字符串:\n");
    for(i=0;i<SIZE;i++){
        printf("%s\n",s[list[i][0]]);
    }
  
}
    
    

第12题

🍋12. 编写一个程序,读取输入,直至读到 EOF,报告读入的单词数、大写字母数、小写字母数、标点符号数和数字字符数。使用ctype.h头文件中的函数。

/*
 * @Description:  编写一个程序,读取输入,直至读到 EOF,报告读入的单词数、大
写字母数、小写字母数、标点符号数和数字字符数。使用ctype.h头文件中的
函数。
 * @Author: ~光~~
 * @Date: 2023-12-29 19:36:42
 * @LastEditTime: 2023-12-29 20:09:23
 * @LastEditors:  
 */
#include<stdio.h>
#include<ctype.h>
int main(void){
    char c;
    int flag=0,test=0,num=0;
    int words=0,capital_letter=0,lowercase_letter=0,punctuation_mark=0,numeric_character=0;
    printf("please enter:\n");
    while((c=getchar())!=EOF){
        if(isalpha(c)){
            if(num){//如果这个字母的前面一个输入的是数字的话 
                flag=0;
                num=0;
            }
            else{ 
                flag+=1;
                test=0;
            }
           
            if(islower(c)) lowercase_letter+=1;
            else capital_letter+=1;
        }else if(isspace(c)){
            test=1;
            punctuation_mark+=1;
        }
        else if(isdigit(c)) {
            numeric_character+=1;
            num=1;
            if(flag>0) flag=0;//如果这个数字前面一个输入的是字母的话
        }
        else continue;

        if(flag>1 && test){
            words+=1;
            flag=0;
            test=0;
        }
    }
    printf("**************************\n");
    printf("the words are %d\n",words);
    printf("the lowercase_letter are %d\n",lowercase_letter);
    printf("the capital_letter are %d\n",capital_letter);
    printf("the punctuation_mark are %d\n",punctuation_mark);
    printf("the numeric_character are %d\n",numeric_character);
    printf("**************************\n");
    return 0; 
}

第13题

🚁编写一个程序,反序显示命令行参数的单词。例如,命令行参数是see you later,该程序应打印later you see

/*
 * @Description:  编写一个程序,反序显示命令行参数的单词。例如,命令行参数是
see you later,该程序应打印later you see。
 * @Author: ~光~~
 * @Date: 2023-12-29 20:14:24
 * @LastEditTime: 2023-12-31 12:58:21
 * @LastEditors:  
 */
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define SIZE 20
#define ROOM 10
int  check_words(char s[]); //检查得到的值是不是一个单词

int main(int argc, char *argv [])
{
    int i,j=0;
    char *s[SIZE];
    char word[ROOM];
    
    for(i=0;i<argc;i++){
        if(check_words(argv[i]))  {
            *(s+j)=argv[i];
            j+=1;
        }
    }
    printf("the orignal character are:");
    for(i=0;i<argc;i++){
        printf("%s ",argv[i]);
    }
    printf("\nthe word character are:");
    for(i=0;i<j;i++){
        printf("%s ",s[i]);
    }
    printf("\nthe reverse character are:");
    for(i=j-1;i>=0;i--){
        printf("%s ",s[i]);
    }
    
    return 0;
}
int  check_words(char s[]){
    int i=0;
   
    for(i=0;s[i]!='\0';i++){
        if(!isalpha(s[i])) return 0;
        
    }
    
    return 1;
}

第14题

⚙️14.编写一个通过命令行运行的程序计算幂。第1个命令行参数是double
类型的数,作为幂的底数,第2个参数是整数,作为幂的指数。

/*
 * @Description:  编写一个通过命令行运行的程序计算幂。第1个命令行参数是double
类型的数,作为幂的底数,第2个参数是整数,作为幂的指数。
 * @Author: ~光~~
 * @Date: 2023-12-31 12:59:14
 * @LastEditTime: 2023-12-31 15:21:39
 * @LastEditors:  
 */

#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main(int argc, char *argv []){
     if (argc != 3) {
        printf("Usage: %s <base> <exponent>\n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);

    double result = pow(base, exponent);
    printf("%.2lf ^ %d = %.2lf\n", base, exponent, result);

   
    return 0; 
}

第15题

🎈15.使用字符分类函数实现atoi()函数。如果输入的字符串不是纯数字,
该函数返回0。

/*
 * @Description:  15.使用字符分类函数实现atoi()函数。如果输入的字符串不是纯数字,
该函数返回0。
 * @Author: ~光~~
 * @Date: 2023-12-31 15:24:55
 * @LastEditTime: 2023-12-31 16:18:27
 * @LastEditors:  
 */
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int atoi_pick(char s[]);//如果是数字就返回数字 不是就返回0  和atoi一样针对整数
int main(int argc, char *argv []){
    int i,t;
    char s[]="1a23";
    printf("the result are:");
  
    for(i=1;i<argc;i++){
       t=atoi_pick(argv[i]);
       printf("%d ",t);
    }
   
    return 0; 
}

int atoi_pick(char s[]){
    int i,result=0,poww=1;
    int sign=1,flag=0;
    int num;
    //处理符号位
    if(s[0]=='+')  sign=1;
    if(s[0]=='-')  sign=-1;
   // printf("sign is %d\n",sign);
    //判断是不是数字

    for(i=1;s[i]!='\0';i++){
        if(!(isdigit(s[i])))  return 0;
    }
    

    //开始对数字处理
    if(s[0]=='+'||s[0]=='-'){
        for(i=strlen(s)-1;i>0;i++){
            num=s[i]-'0';
            result+=num*poww;
            poww*=10;
        }
        if(sign==1) return result;
        else return (-1)*result;
    }
    if(isalnum(s[0])){
        for(i=strlen(s)-1;i>=0;i--){
            num=s[i]-'0';
            result+=num*poww;
            poww*=10;
        }
        return result;
    }

    
}

第16题

🌊16.编写一个程序读取输入,直至读到文件结尾,然后把字符串打印出
来。该程序识别和实现下面的命令行参数:
-p 按原样打印
-u 把输入全部转换成大写
-l 把输入全部转换成小写
如果没有命令行参数,则让程序像是使用了-p参数那样运行。

/*
 * @Description:  16.编写一个程序读取输入,直至读到文件结尾,然后把字符串打印出
来。该程序识别和实现下面的命令行参数:
-p     按原样打印
-u     把输入全部转换成大写
-l     把输入全部转换成小写
如果没有命令行参数,则让程序像是使用了-p参数那样运行。
 * @Author: ~光~~
 * @Date: 2023-12-31 16:19:36
 * @LastEditTime: 2023-12-31 16:31:03
 * @LastEditors:  
 */
#include<stdio.h>
#include<ctype.h>
#define SIZE 100
void function(char s[]);
int main(void){
    char c;
    int i=0;
    char s[SIZE];
    printf("please enter:\n");
    while((c=getchar())!=EOF){
        s[i]=c;
        i++;
    }
    s[i]='\0';
    
    printf("-p     按原样打印\n");
    printf("-u     把输入全部转换成大写\n");
    printf("-l     把输入全部转换成小写\n");
    printf("then  you can enter :");
    function(s);
    return 0; 
}
void function(char s[]){
    char c;
    int i;
    if(getchar()=='-'){
        c=getchar();
        switch(c){
            case 'p':{
                for(i=0;s[i]!='\0';i++){
                    printf("%c",s[i]);
                }
                break;
            }
            case 'u':{
                for(i=0;s[i]!='\0';i++){
                    if(isalpha(s[i])) s[i]=toupper(s[i]);
                    printf("%c",s[i]);
                }
                break;
            }
            case 'l':{
                for(i=0;s[i]!='\0';i++){
                    if(isalpha(s[i])) s[i]=tolower(s[i]);
                    printf("%c",s[i]);
                }
                break;
            }
            default:{
                printf("bye!\n");
                break;
            }
        }
    }else printf("bye!\n");
}

⛵️完成啦~
☘️如果有其他解法~ 欢迎大家讨论 批评指正~
🌈 此编程练习参考答案为本人所写,如有错误欢迎大家批评指正~~ 如转载请说明来源~

🌈ok,完结~(●’◡’●) 看到这里 点个赞叭 (●’◡’●)

  • 50
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~光~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值