task1_1
问题1:找出输入数组中的最大值和最小值
问题2:指向数组的第一个元素位置
task1_2
问题1:找到输入数组中最大值的位置
问题2:可以
task2_1
问题1:s1大小为80
sizeof(s1)计算的是s1数组所占用的内存空间
strlen(s2)计算的是s2数组中字符的实际长度,从字符串起始位置开始计数到"/0"停止计数
问题2:不能。因为字符串数组名在定义之后就代表字符串数组中第一个元素的地址,已经是定值无法改变。
问题3:交换了。
task2_2
问题1:s1存放的是s1数组首元素的地址。
sizeof(s1)计算的是这个字符地址所占的内存空间。
strlen(s2)计算的是s2数组中字符的实际长度,即字符串中字符个数。
问题2:可以。2_1中是给数组初始化,并没有赋值,因为数组名代表的是字符数组初始地址,不能改变。2_2中是指针指向的位置可以改变,并且line6的操作就是让*s1指向后面那个数组的地址。
问题3:交换的是*s1,*s2的数值,两个字符在内存中的地址没有改变。
task3
line16-29中ptr1指针是按照地址一个一个递增来遍历打印出整个数组。ptr2指针是按照一行一行递增来遍历打印出整个数组。
task4
问题1:replace作用为将字符串中的'i'改为'*'。
问题2:可以。
task5

#include <stdio.h>
#define N 80

char* str_trunc(char* str, char x);

int main() {
    char str[N];
    char ch;

    while (printf("输入字符串: "), gets(str) != NULL) {
        printf("输入一个字符: ");
        ch = getchar();

        printf("截断处理...\n");
        str_trunc(str, ch);         // 函数调用

        printf("截断处理后的字符串: %s\n\n", str);
        getchar();
    }

    return 0;
}
char* str_trunc(char* str, char x) {
    char* p = str;
    while (*p != '\0') {
        if (*p == x) {
            *p = '\0';
            break;
        }
        p++;
    }
    return str;
}

可能导致第一次运行正确,但是第二次读取数据时将空格字符读取进去,从而导致程序失去截断字符的作用。

getchar()起到了回收空格字符的作用。

task6

#include <stdio.h>
#include <string.h>
#define N 5

int check_id(char* str); // 函数声明

int main()
{
    char* pid[N] = { "31010120000721656X",
                    "3301061996X0203301",
                    "53010220051126571",
                    "510104199211197977",
                    "53010220051126133Y" };
    int i;

    for (i = 0; i < N; ++i)
        if (check_id(pid[i])) // 函数调用
            printf("%s\tTrue\n", pid[i]);
        else
            printf("%s\tFalse\n", pid[i]);

    return 0;
}
int check_id(char* str) {
    int len = strlen(str);
    if (len != 18) return 0;  

    for (int i = 0; i < 17; i++) {
        if (!isdigit(str[i])) return 0;  
    }

  
    if (!isdigit(str[17]) && str[17] != 'X') return 0;

    return 1; 
}

task7

#include <stdio.h>
#define N 80
void encoder(char* str, int n); // 函数声明
void decoder(char* str, int n); // 函数声明

int main() {
    char words[N];
    int n;

    printf("输入英文文本: ");
    gets(words);

    printf("输入n: ");
    scanf_s("%d", &n);

    printf("编码后的英文文本: ");
    encoder(words, n);      // 函数调用
    printf("%s\n", words);

    printf("对编码后的英文文本解码: ");
    decoder(words, n); // 函数调用
    printf("%s\n", words);

    return 0;
}

/*函数定义
功能:对s指向的字符串进行编码处理
编码规则:
对于a~z或A~Z之间的字母字符,用其后第n个字符替换; 其它非字母字符,保持不变
*/
void encoder(char* str, int n) {
    n = n % 26;  // 处理n大于26的情况
    for (int i = 0; str[i] != '\0'; i++) {
        if (isalpha(str[i])) {
            char base = (str[i] >= 'a') ? 'a' : 'A';
            str[i] = (str[i] - base + n) % 26 + base;
        }
    }
}

/*函数定义
功能:对s指向的字符串进行解码处理
解码规则:
对于a~z或A~Z之间的字母字符,用其前面第n个字符替换; 其它非字母字符,保持不变
*/
void decoder(char* str, int n) {
    n = n % 26;  // 处理n大于26的情况
    for (int i = 0; str[i] != '\0'; i++) {
        if (isalpha(str[i])) {
            char base = (str[i] >= 'a') ? 'a' : 'A';
            str[i] = (str[i] - base - n + 26) % 26 + base;
        }
    }
}

task8

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
    int i, j;
    
    for (i = 1; i < argc - 1; ++i) {
        for (j = i + 1; j < argc; ++j) {
            if (strcmp(argv[i], argv[j]) > 0) {
                char* temp = argv[i];
                argv[i] = argv[j];
                argv[j] = temp;
            }
        }
    }
    for (i = 1; i < argc; ++i) {
        printf("hello, %s\n", argv[i]);
    }
    return 0;
}

 

 posted on 2025-05-25 20:34  .Embrace  阅读(10)  评论(0)    收藏  举报