小甲鱼s1E26C语言动动手

0:

#include <stdio.h>

int main()
{
    char str[1024];
    char *p = str; // 用于间接寻址
    char *pos[1024] = {0};
    int len = 0;
    int cChar = 0, cWord = 0; // cChar统计字符数,cWord统计单词数
    int max = 0, i = 0, j;

    printf("请输入一个英文句子:");
    // 接收输入,顺带统计用户实际输入了多少字符
    while((str[len++] = getchar()) != '\n' && len + 1 < 1024)
        ;
    str[len-1] = '\0'; // str[len]存放的是'\n',将其替换为'\0'

    if (*p != ' '){
        pos[i++] = p; //记录第一个单词的地址
        cWord++;
    }

    while(len--){
        if (*p++ == ' '){
            // 判断最大字符数
            max = cChar > max ? cChar : max;
            cChar = 0;

            // 到底了,退出循环
            if (*p == '\0'){
                break;
            }

            // 单词数加一
            if (*p != ' '){
                pos[i++] = p;
                cWord++;
            }
        }
        else { // 没有else会把空格统计进去
            cChar++;
        }
    }
    max = --cChar > max ? cChar : max; // 最后会算多一个'\0',所以减去

    // 申请可变长数组,max+1,否则'\0'放不下
    char result[cWord][max+1];

    // 将分割好的单词放进二维数组里
    for (i = 0; i < cWord; i++){
        for (j = 0; *(pos[i]+j) != ' ' && *(pos[i]+j) != '\0'; j++){
            result[i][j] = *(pos[i]+j);
        }
        result[i][j] = '\0';
    }

    // 打印结果
    printf("分割结果已存放到result[%d][%d]的二维数组中...\n",cWord,max+1);
    printf("现在依次打印每个单词:\n");
    for (i = 0; i < cWord; i++){
        printf("%s\n",result[i]);
    }

    return 0;
}

1:

#include <stdio.h>

int main()
{
    char str[1024];
    char *p = str; // 用于间接寻址
    char *pos[1024] = {0}; // 将分割后的每个字符串的一个字符的地址存储
    int len = 0; // 用于计算输入字符的个数
    int i = 0, max = 0, j;
    int cWord = 0, cChar = 0; // cWord用于存储分割后的字符串的个数,cChar用于计算字符串的字符个数
    char s; // 定义分隔符

    printf("请输入一个英文句子:");
    while((str[len++] = getchar()) != '\n' && len + 1 < 1024)
            ;
    str[len-1] = '\0'; // 由于getchar接收的结尾是'\n',将'\n'替换为'\0'方便后续操作

    // 让用户输入分割符
    printf("请输入分隔符:");
    scanf("%c",&s);

    if (*p != s){
        pos[i++] = p; // 判断输入的句子第一个字符是否为空格
        cWord++;
    }

    while(len--){
        if (*p++ == s){
            max = cChar > max ? cChar : max; // 判断最大的字符个数
            cChar = 0; // 清零

            if (*p == '\0'){
                break; // 字符串结尾了,跳出循环
            }

            if (*p != s){ //此时的*p已经是++之后的p了,所以如果不是分隔符,那就是下一个字符串开始的那个字符的地址
                pos[i++] = p;
                cWord++;
            }
        } else {
            cChar++; // 没有else会将空格也记录进去,统计字符的个数
        }
    }

    max = --cChar > max ? cChar : max; // 由于最后会多一个'\0'所以要减去

    // 定义变长数组 max+1,否则装不下'\0'
    char result[cWord][max+1];

    // 动态的往result数组中输入字符串
    for (i = 0; i < cWord; i++){
        for (j = 0; *(pos[i]+j) != s && *(pos[i]+j) != '\0'; j++){ // *(pos[i]+j),因为pos数组中存储的是每个字符串最开始的那个字符,
            result[i][j] = *(pos[i]+j);                             // 所以pos[i]就是那个字符的地址,而+j就是在那个字符的地址上进行偏移,得到整个字符串
        }
        result[i][j] = '\0'; // 添加结束符
    }

    // 打印字符串
    printf("分割好的字符串已经存储到result[%d][%d]二维数组中\n",cWord,max+1);
    printf("现在开始依次打印字符串...\n");
    for (i = 0; i < cWord; i++){
        printf("%s\n",result[i]);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GospeLLLLLL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值