指针型函数实现插入字符

【问题描述】
编写一函数char * insert(char *string, char c),用于在一个已排好序(ASCII值从小到大)的字符串string(少于50个字符)中适当位置插入字符c,要求插入后串的序不变(从小到大),允许字符重复,函数返回插入后的字符串。
在main函数中测试该函数:从键盘分别输入有序字符串和单个字符,然后调用insert函数,并向屏幕输出插入后的字符串。
【输入形式】
从键盘分行输入有序字符串和单个字符
【输出形式】
向屏幕输出插入后的字符串
【输入样例】

abdef   
c

【输出样例】

abcdef

【样例说明】
从键盘输入少于50个字符的有序字符串abdef和字符c,通过调用函数char * insert(char *string, char c)将字符c插入字符串abdef,并以ASCII值从小到大排序输出

#include<stdio.h>
#include<string.h> 
#include<stdlib.h>
char *insert(char *string, char c);
int main() {
    char a, str[50];
    gets(str);
    scanf("%c", &a);
    printf("%s", insert(str, a));
    return 0;
}
char *insert(char *string, char c) {
    char *p = string, s[51];
    int jud1, jud2, flag, i, j;             
    flag = 1;                                    //判断是否插入字符
    for (i = 0, j = 0; *(p + i) != '\0'; i++, j++) {   
        jud1 = *(p + i) >= c;                    //判断string[i]是否大于c
        jud2 = (i == 0) || (*(p + i -1) <= c);   //判断string[i]是否为第一个元素或小于c
        if ((jud1 && jud2 &&flag)) {             //判断c是否插在最前或中间
            *(s + j) = c;
            j++;
            *(s + j) = *(p + i);
            flag = 0;
        }
        else if (*(p + i + 1) == '\0' && flag) { //判断c是否插在最后
            *(s + j) = *(p + i);
            j++;
            *(s + j) = c;
        }
        else {
            *(s + j) = *(p + i);
        }
    }
    *(s + j) = '\0';
    strcpy(string, s);
    return string;
}

或可直接将字符合并到字符串中后再次排序,这样的代码执行会更简单 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以这样实现: ```c #include <stdio.h> void insert_space(char *str) { int i = ; while (str[i] != '\') { printf("%c ", str[i]); i++; } } int main() { char str[] = "hello"; insert_space(str); return ; } ``` 这个程序定义了一个函数 `insert_space`,它的参数是一个字符指针 `str`,表示要处理的字符串。函数内部使用了一个循环,遍历字符串中的每个字符,然后在字符后面插入一个空格,最后输出处理后的字符串。在主函数中,我们定义了一个字符串 `str`,然后调用 `insert_space` 函数对它进行处理。 ### 回答2: 对于这个问题,我们可以先了解一下字符指针字符串的概念,然后再思考如何实现字符串每个字符插入一个空格的功能。 字符指针是指向字符数据的指针,它可以指向一个字符的地址,也可以指向一个字符串的首字符地址。字符串是由一串字符组成的字符数组,以'\0'(空字符)作为结束符。 那么,如何实现字符串每个字符插入一个空格的功能呢? 可以定义一个函数函数的形参为字符指针函数的返回字符指针。 第一步,我们需要知道字符串的长度,可以使用strlen()函数求出字符串的长度。 第二步,创建一个新的字符数组,数组的长度为原始字符串长度的两倍(每个字符中间都插入一个空格)再加1(最后一位为'\0')。 第三步,在新的字符数组中按照顺序插入原始字符串中的每一个字符以及空格。 第四步,返回新的字符数组的首地址。 下面是具体的代码实现: ```C++ #include <iostream> #include <cstring> using namespace std; char* insert_space(char* str) { int len = strlen(str); char* new_str = new char[len * 2 + 1]; // 创建新的字符数组 int j = 0; // 指向新字符数组的下标 for(int i = 0; i < len; i++) { new_str[j++] = str[i]; new_str[j++] = ' '; // 插入空格 } new_str[j] = '\0'; // 最后一位为'\0',表示字符串结束 return new_str; // 返回新字符数组的首地址 } int main() { char* str = "hello world"; char* new_str = insert_space(str); cout << new_str << endl; // 输出:"h e l l o w o r l d" delete[] new_str; // 释放new_str指向的内存 new_str = NULL; return 0; } ``` 在这个示例中,我们使用了new运算符来在堆上分配内存,以确保在函数调用后新字符数组不会被释放。因为我们必须在函数内创建新的字符数组。当完成使用新字符串时,应该使用delete[]运算符释放它所占用的内存。 ### 回答3: 在C语言中,字符指针常被用于操作字符串。函数指针作为函数的参数,可以传递一个函数作为另一个函数的某个操作。要实现字符串每个字符插入一个空格的功能,可以定义一个函数,该函数接受一个字符指针的参数,遍历该指针指向的字符串,将每个字符插入一个空格,最后输出修改后的字符串。 函数实现如下: #include <stdio.h> #include <string.h> void add_space(char *str) { int len = strlen(str); //获取字符串的长度 int new_len = len*2+1; //计算添加空格后的长度 char new_str[new_len]; //定义保存修改后的字符串数组 int j = 0; //新数组的下标 for(int i=0; i<len; i++) { //遍历原字符串 new_str[j] = str[i]; //先将原字符复制到新数组中 j++; //新数组下标加一 new_str[j] = ' '; //插入空格 j++; //新数组下标加一 } new_str[new_len-1] = '\0'; //在新数组末尾添加空字符,表示字符串结束 printf("%s", new_str); //输出修改后的字符串 } int main() { char str[] = "hello world"; add_space(str); return 0; } 在main函数中,定义了一个字符串"hello world",并将该字符串作为参数传递给add_space函数进行空格插入操作。add_space函数首先获取字符串的长度,计算出添加空格后的长度,并定义一个新数组来保存修改后的字符串。然后遍历原字符串,将每个字符和空格依次保存到新数组中,最后输出修改后的字符串。 需要注意的是,在函数内部定义的数组,其生存期只在函数内部存在,函数执行结束后,该数组所占内存会被释放,因此不能将该数组作为返回返回。最好的方法是在函数内部输出修改后的字符串,或者将修改后的字符串保存在全局变量中。 另外,为了避免修改原字符串,也可以另外定义一个指针变量,指向原字符串并进行遍历操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

*OASIS*

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

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

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

打赏作者

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

抵扣说明:

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

余额充值