C Primer Plus 第6版 编程练习——第11章(中)

  1. strncpy(s1, s2,n)函数把s2中的n个字符拷贝至s1中,截断s2,或者有必要的话在末尾添加空字符。如果s2的长度是n或多于n,目标字符串不能以空字符结尾。该函数返回s1。自己编写一个这样的函数,名为mystrncpy()。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。
cpp 复制代码
char* mystrncpy(char* s1, char* s2, int n)
{
    int i = 0;
    while (i < n && *s2 != '\0')
    {
        *s1 = *s2;
        s1++;
        s2++;
        i++;
    }
    *s1 = '\0';
    return s1;
}
int main()
{
    system("chcp 65001");
    char s1[100] = { 0 };
    char s2[100];
    while (1)
    {
        printf("请输入字符串:\n");
        gets_s(s2);
        printf("请输入字符数:\n");
        int n;
        scanf_s("%d", &n);
        getchar();
        mystrncpy(s1, s2, n);
        printf("%s\n", s1);
    }
    return 0;
}

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

cpp 复制代码
char* string_in(char* str1, char* str2)
{
    while (*str1 != '\0')
    {
        char* p = str1;
        char* q = str2;
        while (*p == *q && *q != '\0')
        {
            p++;
            q++;
        }
        if (*q == '\0')
        {
            return str1;
        }
        str1++;
    }
    return NULL;
}
int main()
{
    system("chcp 65001");
    char str1[100] = { 0 };
    char str2[100];
    while (1)
    {
        printf("请输入字符串:\n");
        gets_s(str1);
        printf("请输入子字符串:\n");
        gets_s(str2);
        char* p = string_in(str1, str2);
        if (p != NULL)
        {
            printf("子字符串%s在字符串%s中的位置是%p\n", str2, str1, p);
        }
        else
        {
            printf("未找到子字符串%s\n", str2);
        }
    }
    return 0;
}

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

cpp 复制代码
void reverse_string(char* str)
{
    char* p = str;
    char* q = str;
    while (*q != '\0')
    {
        q++;
    }
    q--;
    while (p < q)
    {
        char temp = *p;
        *p = *q;
        *q = temp;
        p++;
        q--;
    }
}
int main()
{
    system("chcp 65001");
    char str[100];
    while (1)
    {
        printf("请输入字符串:\n");
        gets_s(str);
        reverse_string(str);
        printf("%s\n", str);
    }
    return 0;
}

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

cpp 复制代码
void delete_space(char* str)
{
    char* p = str;
    while (*p != '\0')
    {
        if (*p != ' ')
        {
            *str = *p;
            str++;
        }
        p++;
    }
    *str = '\0';
}
int main()
{
    system("chcp 65001");
    char str[100];
    while (1)
    {
        printf("请输入字符串:\n");
        gets_s(str);
        delete_space(str);
        printf("%s\n", str);
        if (str[0] == '\0')
        {
            break;
        }
    }
    return 0;
}

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

cpp 复制代码
int main()
{
    system("chcp 65001");
    char str[10][100] = { 0 };
    char tempstr[10][100] = { 0 };
    int i = 0;
    while (i < 10)
    {
        printf("请输入第%d个字符串:\n", i + 1);
        gets_s(str[i]);
        if (str[i][0] == '\0')
        {
            break;
        }
        i++;
    }
    memcpy(tempstr, str, 1000);
    while (1)
    {
        printf("1.打印源字符串列表\n");
        printf("2.以ASCII中的顺序打印字符串\n");
        printf("3.按长度递增顺序打印字符串\n");
        printf("4.按字符串中第1个单词的长度打印字符串\n");
        printf("5.退出\n");
        printf("请选择:\n");
        int choice;
        scanf_s("%d", &choice);
        getchar();
        switch (choice)
        {
        case 1: 
            for (int j = 0; j < i; j++)
            {
                printf("%s\n", str[j]);
            }
            break;
        case 2: 
            for (int j = 0; j < i; j++)
            {
                for (int k = j + 1; k < i; k++)
                {
                    if (strcmp(tempstr[j], tempstr[k]) > 0)
                    {
                        char temp[100];
                        strcpy_s(temp, tempstr[j]);
                        strcpy_s(tempstr[j], tempstr[k]);
                        strcpy_s(tempstr[k], temp);
                    }
                }
            }
            for (int j = 0; j < i; j++)
            {
                printf("%s\n", tempstr[j]);
            }
            break;
        case 3: 
            for (int j = 0; j < i; j++)
            {
                for (int k = j + 1; k < i; k++)
                {
                    if (strlen(tempstr[j]) > strlen(tempstr[k]))
                    {
                        char temp[100];
                        strcpy_s(temp, tempstr[j]);
                        strcpy_s(tempstr[j], tempstr[k]);
                        strcpy_s(tempstr[k], temp);
                    }
                }
            }
            for (int j = 0; j < i; j++)
            {
                printf("%s\n", tempstr[j]);
            }
            break;
        case 4: 
            for (int j = 0; j < i; j++)
            {
                char* p = strchr(tempstr[j], ' ');
                int len = p - tempstr[j];
                for (int k = j + 1; k < i; k++)
                {
                    char* q = strchr(tempstr[k], ' ');
                    int len2 = q - tempstr[k];
                    if (len > len2)
                    {
                        char temp[100];
                        strcpy_s(temp, tempstr[j]);
                        strcpy_s(tempstr[j], tempstr[k]);
                        strcpy_s(tempstr[k], temp);
                    }
                }
            }
            for (int j = 0; j < i; j++)
            {
                printf("%s\n", tempstr[j]);
            }
            break;
        case 5: 
            return 0;
        }

    }
    return 0;
}