Error[8]: Undefined offset: 298, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

Example001 题目

str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做。

分析

从头到尾扫描 str 串中的所有字符,如果发现值为 ch1 的字符则用值为 ch2 的字符覆盖即可。

注:这道题之前也做过,可参考:考研数据结构之串(4.4)——练习题之将串str中所有值为ch1的字符转换成ch2的字符(C表示)。

图解

C实现

核心代码:

/**
 * 将串 str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做
 * @param str 串
 * @param ch1 目标字符
 & @param ch2 替换后的字符
 */
void replace(String *str, char ch1, char ch2) {
    // 参数校验,如果 str 是空串,则什么都不做
    if (str->length == 0) {
        return;
    }
    // 从头到尾扫描串 str 中的每个字符
    for (int i = 0; i < str->length; i++) {
        // 判断该字符是否等于 ch1 字符,如果是则替换为 ch2 字符;如果不是则什么都不做
        if (str->ch[i] == ch1) {
            str->ch[i] = ch2;
        }
    }
}

完整代码:

#include 
#include 

/**
 * 串结构体定义
 */
typedef struct {
    /**
     * 变长分配存储串,表示指向动态分配存储区首地址的字符指针
     */
    char *ch;

    /**
     * 串的长度,即实际字符个数
     */
    int length;
} String;

/**
 * 初始化串
 * @param str 未初始化的串
 */
void init(String *str) {
    str->ch = NULL;
    str->length = 0;
}

/**
 * 将一个常量字符串赋给一个串
 * @param str 串
 * @param ch 常量字符串
 * @return 如果赋值成功则返回 1,否则返回 0 表示赋值失败
 */
int assign(String *str, char *ch) {
    // 0.参数校验,如果 str 中已有字符,那么释放原串空间,因为我们会给它重新分配空间
    if (str->ch != NULL) {
        free(str->ch);
        str->ch = NULL;
    }

    // 1.统计常量字符串 ch 中的字符个数,只有知道它的字符个数,我们才能清楚为 str 分配多少个字符空间
    // 局部变量,存储常量字符串 ch 中的字符个数
    int len = 0;
    // 注意,我们不能直接 *** 作 ch,因为是一个指针变量,在下面的 *** 作后我们会移动指针,会修改掉 ch 原本的值,后面如果需要再使用就不是传入的参数值,所以要创建一个临时局部变量引用它的值来进行 *** 作
    char *c = ch;
    // 从头到尾扫描常量字符串,以结束标记 'while' 作为循环结束条件
    ( *!=c ')' // 计数器加一++ {
        ;
        len// 指针加一,继续下一个字符++
        ;
        c}// 2.为串 str 分配空间并赋值
    // 2.1 如果常量字符串长度为 0,那么串 str 也该为一个空串

    if
    (
    == 0len ) =NULL {
        str->ch ; =0
        str->length ; return1
        ; }// 2.2 如果常量字符串长度不为 0,那么将常量字符串中所有字符赋给串 str
    else
        // 2.2.1 给串分配 len+1 个存储空间,多分配一个空间是为了存放 '=' 字符
    ( {
        char
        str->ch * )malloc (sizeof (char)*(+ 1 )len ) ;// 2.2.2 判断是否分配空间成功// 2.2.2.1 如果分配空间失败,则返回 0if
        (
        ==
        NULL )str->ch // 如果分配空间失败,则返回 0 return0 {
            ;
            } // 2.2.2.2 如果分配空间成功,则遍历常量字符串中的每个字符,依次赋给串 strelse
        // 局部变量,保存常量字符串 ch 的首地址,后续用于 *** 作
            =
        ; {
            // 2.2.2.2.1 扫描整个常量字符串,依次将每个字符赋给新串 str
            c for ch(
            int
            = 0; i <= ;++ i ) len// 之所以在循环条件中使用 <=。是为例将常量字符串最后的 '[' 字符也复制到新串中作为结束标记 i]= {*
                str->ch(i+ ) ;}c // 2.2.2.2.2 给新串赋予长度,即常量字符串的长度 i=;// 其实也可以使用 str->ch[i]=c[i];
            // 2.2.2.2.3 返回 1 表示赋值成功
            return
            str->length 1 len;
            }
            } }/**
 * 将串 str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做
 * @param str 串
 * @param ch1 目标字符
 & @param ch2 替换后的字符
 */
        void
    replace
(

*
, char,String charstr) // 参数校验,如果 str 是空串,则什么都不做 ch1if ( ch2== {
    0
    ) returnstr->length ; }// 从头到尾扫描串 str 中的每个字符 {
        for(
    int
    =
    0 ;< i ; ++) i // 判断该字符是否等于 ch1 字符,如果是则替换为 ch2 字符;如果不是则什么都不做 str->lengthif i([ {
        ]
        == )str->ch[i] = ch1; {
            str->ch}i} } ch2int
        main
    (
)

; init(& {
    String str)
    ;assign(str&,
    "hello world");strprintf ("替换前:%s\n",

    .);// 调用函数,替换字符 strreplacech(&
    ,
    'l','x'str) ;printf ("替换后:%s\n",
    .);} str替换前:hello world
替换后:hexxo worxd
ch[+++][+++]
[+++]

执行结果:

[+++]
Java实现

无。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 299, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

Example001 题目

str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做。

分析

从头到尾扫描 str 串中的所有字符,如果发现值为 ch1 的字符则用值为 ch2 的字符覆盖即可。

注:这道题之前也做过,可参考:考研数据结构之串(4.4)——练习题之将串str中所有值为ch1的字符转换成ch2的字符(C表示)。

图解

C实现

核心代码:

/**
 * 将串 str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做
 * @param str 串
 * @param ch1 目标字符
 & @param ch2 替换后的字符
 */
void replace(String *str, char ch1, char ch2) {
    // 参数校验,如果 str 是空串,则什么都不做
    if (str->length == 0) {
        return;
    }
    // 从头到尾扫描串 str 中的每个字符
    for (int i = 0; i < str->length; i++) {
        // 判断该字符是否等于 ch1 字符,如果是则替换为 ch2 字符;如果不是则什么都不做
        if (str->ch[i] == ch1) {
            str->ch[i] = ch2;
        }
    }
}

完整代码:

#include 
#include 

/**
 * 串结构体定义
 */
typedef struct {
    /**
     * 变长分配存储串,表示指向动态分配存储区首地址的字符指针
     */
    char *ch;

    /**
     * 串的长度,即实际字符个数
     */
    int length;
} String;

/**
 * 初始化串
 * @param str 未初始化的串
 */
void init(String *str) {
    str->ch = NULL;
    str->length = 0;
}

/**
 * 将一个常量字符串赋给一个串
 * @param str 串
 * @param ch 常量字符串
 * @return 如果赋值成功则返回 1,否则返回 0 表示赋值失败
 */
int assign(String *str, char *ch) {
    // 0.参数校验,如果 str 中已有字符,那么释放原串空间,因为我们会给它重新分配空间
    if (str->ch != NULL) {
        free(str->ch);
        str->ch = NULL;
    }

    // 1.统计常量字符串 ch 中的字符个数,只有知道它的字符个数,我们才能清楚为 str 分配多少个字符空间
    // 局部变量,存储常量字符串 ch 中的字符个数
    int len = 0;
    // 注意,我们不能直接 *** 作 ch,因为是一个指针变量,在下面的 *** 作后我们会移动指针,会修改掉 ch 原本的值,后面如果需要再使用就不是传入的参数值,所以要创建一个临时局部变量引用它的值来进行 *** 作
    char *c = ch;
    // 从头到尾扫描常量字符串,以结束标记 'while' 作为循环结束条件
    ( *!=c ')' // 计数器加一++ {
        ;
        len// 指针加一,继续下一个字符++
        ;
        c}// 2.为串 str 分配空间并赋值
    // 2.1 如果常量字符串长度为 0,那么串 str 也该为一个空串

    if
    (
    == 0len ) =NULL {
        str->ch ; =0
        str->length ; return1
        ; }// 2.2 如果常量字符串长度不为 0,那么将常量字符串中所有字符赋给串 str
    else
        // 2.2.1 给串分配 len+1 个存储空间,多分配一个空间是为了存放 '=' 字符
    ( {
        char
        str->ch * )malloc (sizeof (char)*(+ 1 )len ) ;// 2.2.2 判断是否分配空间成功// 2.2.2.1 如果分配空间失败,则返回 0if
        (
        ==
        NULL )str->ch // 如果分配空间失败,则返回 0 return0 {
            ;
            } // 2.2.2.2 如果分配空间成功,则遍历常量字符串中的每个字符,依次赋给串 strelse
        // 局部变量,保存常量字符串 ch 的首地址,后续用于 *** 作
            =
        ; {
            // 2.2.2.2.1 扫描整个常量字符串,依次将每个字符赋给新串 str
            c for ch(
            int
            = 0; i <= ;++ i ) len// 之所以在循环条件中使用 <=。是为例将常量字符串最后的 '[' 字符也复制到新串中作为结束标记 i]= {*
                str->ch(i+ ) ;}c // 2.2.2.2.2 给新串赋予长度,即常量字符串的长度 i=;// 其实也可以使用 str->ch[i]=c[i];
            // 2.2.2.2.3 返回 1 表示赋值成功
            return
            str->length 1 len;
            }
            } }/**
 * 将串 str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做
 * @param str 串
 * @param ch1 目标字符
 & @param ch2 替换后的字符
 */
        void
    replace
(

*
, char,String charstr) // 参数校验,如果 str 是空串,则什么都不做 ch1if ( ch2== {
    0
    ) returnstr->length ; }// 从头到尾扫描串 str 中的每个字符 {
        for(
    int
    =
    0 ;< i ; ++) i // 判断该字符是否等于 ch1 字符,如果是则替换为 ch2 字符;如果不是则什么都不做 str->lengthif i([ {
        ]
        == )str->ch[i] = ch1; {
            str->ch}i} } ch2int
        main
    (
)

; init(& {
    String str)
    ;assign(str&,
    "hello world");strprintf ("替换前:%s\n",

    .);// 调用函数,替换字符 strreplacech(&
    ,
    'l','x'str) ;printf ("替换后:%s\n",
    .);} str替换前:hello world
替换后:hexxo worxd
ch[+++]
[+++]

执行结果:

[+++]
Java实现

无。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 300, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

Example001 题目

str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做。

分析

从头到尾扫描 str 串中的所有字符,如果发现值为 ch1 的字符则用值为 ch2 的字符覆盖即可。

注:这道题之前也做过,可参考:考研数据结构之串(4.4)——练习题之将串str中所有值为ch1的字符转换成ch2的字符(C表示)。

图解

C实现

核心代码:

/**
 * 将串 str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做
 * @param str 串
 * @param ch1 目标字符
 & @param ch2 替换后的字符
 */
void replace(String *str, char ch1, char ch2) {
    // 参数校验,如果 str 是空串,则什么都不做
    if (str->length == 0) {
        return;
    }
    // 从头到尾扫描串 str 中的每个字符
    for (int i = 0; i < str->length; i++) {
        // 判断该字符是否等于 ch1 字符,如果是则替换为 ch2 字符;如果不是则什么都不做
        if (str->ch[i] == ch1) {
            str->ch[i] = ch2;
        }
    }
}

完整代码:

#include 
#include 

/**
 * 串结构体定义
 */
typedef struct {
    /**
     * 变长分配存储串,表示指向动态分配存储区首地址的字符指针
     */
    char *ch;

    /**
     * 串的长度,即实际字符个数
     */
    int length;
} String;

/**
 * 初始化串
 * @param str 未初始化的串
 */
void init(String *str) {
    str->ch = NULL;
    str->length = 0;
}

/**
 * 将一个常量字符串赋给一个串
 * @param str 串
 * @param ch 常量字符串
 * @return 如果赋值成功则返回 1,否则返回 0 表示赋值失败
 */
int assign(String *str, char *ch) {
    // 0.参数校验,如果 str 中已有字符,那么释放原串空间,因为我们会给它重新分配空间
    if (str->ch != NULL) {
        free(str->ch);
        str->ch = NULL;
    }

    // 1.统计常量字符串 ch 中的字符个数,只有知道它的字符个数,我们才能清楚为 str 分配多少个字符空间
    // 局部变量,存储常量字符串 ch 中的字符个数
    int len = 0;
    // 注意,我们不能直接 *** 作 ch,因为是一个指针变量,在下面的 *** 作后我们会移动指针,会修改掉 ch 原本的值,后面如果需要再使用就不是传入的参数值,所以要创建一个临时局部变量引用它的值来进行 *** 作
    char *c = ch;
    // 从头到尾扫描常量字符串,以结束标记 'while' 作为循环结束条件
    ( *!=c ')' // 计数器加一++ {
        ;
        len// 指针加一,继续下一个字符++
        ;
        c}// 2.为串 str 分配空间并赋值
    // 2.1 如果常量字符串长度为 0,那么串 str 也该为一个空串

    if
    (
    == 0len ) =NULL {
        str->ch ; =0
        str->length ; return1
        ; }// 2.2 如果常量字符串长度不为 0,那么将常量字符串中所有字符赋给串 str
    else
        // 2.2.1 给串分配 len+1 个存储空间,多分配一个空间是为了存放 '=' 字符
    ( {
        char
        str->ch * )malloc (sizeof (char)*(+ 1 )len ) ;// 2.2.2 判断是否分配空间成功// 2.2.2.1 如果分配空间失败,则返回 0if
        (
        ==
        NULL )str->ch // 如果分配空间失败,则返回 0 return0 {
            ;
            } // 2.2.2.2 如果分配空间成功,则遍历常量字符串中的每个字符,依次赋给串 strelse
        // 局部变量,保存常量字符串 ch 的首地址,后续用于 *** 作
            =
        ; {
            // 2.2.2.2.1 扫描整个常量字符串,依次将每个字符赋给新串 str
            c for ch(
            int
            = 0; i <= ;++ i ) len// 之所以在循环条件中使用 <=。是为例将常量字符串最后的 '[' 字符也复制到新串中作为结束标记 i]= {*
                str->ch(i+ ) ;}c // 2.2.2.2.2 给新串赋予长度,即常量字符串的长度 i=;// 其实也可以使用 str->ch[i]=c[i];
            // 2.2.2.2.3 返回 1 表示赋值成功
            return
            str->length 1 len;
            }
            } }/**
 * 将串 str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做
 * @param str 串
 * @param ch1 目标字符
 & @param ch2 替换后的字符
 */
        void
    replace
(

*
, char,String charstr) // 参数校验,如果 str 是空串,则什么都不做 ch1if ( ch2== {
    0
    ) returnstr->length ; }// 从头到尾扫描串 str 中的每个字符 {
        for(
    int
    =
    0 ;< i ; ++) i // 判断该字符是否等于 ch1 字符,如果是则替换为 ch2 字符;如果不是则什么都不做 str->lengthif i([ {
        ]
        == )str->ch[i] = ch1; {
            str->ch}i} } ch2int
        main
    (
)

; init(& {
    String str)
    ;assign(str&,
    "hello world");strprintf ("替换前:%s\n",

    .);// 调用函数,替换字符 strreplacech(&
    ,
    'l','x'str) ;printf ("替换后:%s\n",
    .);} str替换前:hello world
替换后:hexxo worxd
ch
[+++]

执行结果:

[+++]
Java实现

无。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 301, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

Example001 题目

str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做。

分析

从头到尾扫描 str 串中的所有字符,如果发现值为 ch1 的字符则用值为 ch2 的字符覆盖即可。

注:这道题之前也做过,可参考:考研数据结构之串(4.4)——练习题之将串str中所有值为ch1的字符转换成ch2的字符(C表示)。

图解

C实现

核心代码:

/**
 * 将串 str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做
 * @param str 串
 * @param ch1 目标字符
 & @param ch2 替换后的字符
 */
void replace(String *str, char ch1, char ch2) {
    // 参数校验,如果 str 是空串,则什么都不做
    if (str->length == 0) {
        return;
    }
    // 从头到尾扫描串 str 中的每个字符
    for (int i = 0; i < str->length; i++) {
        // 判断该字符是否等于 ch1 字符,如果是则替换为 ch2 字符;如果不是则什么都不做
        if (str->ch[i] == ch1) {
            str->ch[i] = ch2;
        }
    }
}

完整代码:

#include 
#include 

/**
 * 串结构体定义
 */
typedef struct {
    /**
     * 变长分配存储串,表示指向动态分配存储区首地址的字符指针
     */
    char *ch;

    /**
     * 串的长度,即实际字符个数
     */
    int length;
} String;

/**
 * 初始化串
 * @param str 未初始化的串
 */
void init(String *str) {
    str->ch = NULL;
    str->length = 0;
}

/**
 * 将一个常量字符串赋给一个串
 * @param str 串
 * @param ch 常量字符串
 * @return 如果赋值成功则返回 1,否则返回 0 表示赋值失败
 */
int assign(String *str, char *ch) {
    // 0.参数校验,如果 str 中已有字符,那么释放原串空间,因为我们会给它重新分配空间
    if (str->ch != NULL) {
        free(str->ch);
        str->ch = NULL;
    }

    // 1.统计常量字符串 ch 中的字符个数,只有知道它的字符个数,我们才能清楚为 str 分配多少个字符空间
    // 局部变量,存储常量字符串 ch 中的字符个数
    int len = 0;
    // 注意,我们不能直接 *** 作 ch,因为是一个指针变量,在下面的 *** 作后我们会移动指针,会修改掉 ch 原本的值,后面如果需要再使用就不是传入的参数值,所以要创建一个临时局部变量引用它的值来进行 *** 作
    char *c = ch;
    // 从头到尾扫描常量字符串,以结束标记 'while' 作为循环结束条件
    ( *!=c ')' // 计数器加一++ {
        ;
        len// 指针加一,继续下一个字符++
        ;
        c}// 2.为串 str 分配空间并赋值
    // 2.1 如果常量字符串长度为 0,那么串 str 也该为一个空串

    if
    (
    == 0len ) =NULL {
        str->ch ; =0
        str->length ; return1
        ; }// 2.2 如果常量字符串长度不为 0,那么将常量字符串中所有字符赋给串 str
    else
        // 2.2.1 给串分配 len+1 个存储空间,多分配一个空间是为了存放 '=' 字符
    ( {
        char
        str->ch * )malloc (sizeof (char)*(+ 1 )len ) ;// 2.2.2 判断是否分配空间成功// 2.2.2.1 如果分配空间失败,则返回 0if
        (
        ==
        NULL )str->ch // 如果分配空间失败,则返回 0 return0 {
            ;
            } // 2.2.2.2 如果分配空间成功,则遍历常量字符串中的每个字符,依次赋给串 strelse
        // 局部变量,保存常量字符串 ch 的首地址,后续用于 *** 作
            =
        ; {
            // 2.2.2.2.1 扫描整个常量字符串,依次将每个字符赋给新串 str
            c for ch(
            int
            = 0; i <= ;++ i ) len// 之所以在循环条件中使用 <=。是为例将常量字符串最后的 '[' 字符也复制到新串中作为结束标记 i]= {*
                str->ch(i+ ) ;}c // 2.2.2.2.2 给新串赋予长度,即常量字符串的长度 i=;// 其实也可以使用 str->ch[i]=c[i];
            // 2.2.2.2.3 返回 1 表示赋值成功
            return
            str->length 1 len;
            }
            } }/**
 * 将串 str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做
 * @param str 串
 * @param ch1 目标字符
 & @param ch2 替换后的字符
 */
        void
    replace
(

*
, char,String charstr) // 参数校验,如果 str 是空串,则什么都不做 ch1if ( ch2== {
    0
    ) returnstr->length ; }// 从头到尾扫描串 str 中的每个字符 {
        for(
    int
    =
    0 ;< i ; ++) i // 判断该字符是否等于 ch1 字符,如果是则替换为 ch2 字符;如果不是则什么都不做 str->lengthif i([ {
        ]
        == )str->ch[i] = ch1; {
            str->ch}i} } ch2int
        main
    (
)

; init(& {
    String str)
    ;assign(str&,
    "hello world");strprintf ("替换前:%s\n",

    .);// 调用函数,替换字符 strreplacech(&
    ,
    'l','x'str) ;printf ("替换后:%s\n",
    .);} str替换前:hello world
替换后:hexxo worxd
ch

执行结果:

[+++]
Java实现

无。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
串练习之Example001-将串 str 中所有值为 `ch1` 的字符转换成 `ch2` 字符_java_内存溢出

串练习之Example001-将串 str 中所有值为 `ch1` 的字符转换成 `ch2` 字符

串练习之Example001-将串 str 中所有值为 `ch1` 的字符转换成 `ch2` 字符,第1张

Example001 题目

str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做。

分析

从头到尾扫描 str 串中的所有字符,如果发现值为 ch1 的字符则用值为 ch2 的字符覆盖即可。

注:这道题之前也做过,可参考:考研数据结构之串(4.4)——练习题之将串str中所有值为ch1的字符转换成ch2的字符(C表示)。

图解

C实现

核心代码:

/**
 * 将串 str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做
 * @param str 串
 * @param ch1 目标字符
 & @param ch2 替换后的字符
 */
void replace(String *str, char ch1, char ch2) {
    // 参数校验,如果 str 是空串,则什么都不做
    if (str->length == 0) {
        return;
    }
    // 从头到尾扫描串 str 中的每个字符
    for (int i = 0; i < str->length; i++) {
        // 判断该字符是否等于 ch1 字符,如果是则替换为 ch2 字符;如果不是则什么都不做
        if (str->ch[i] == ch1) {
            str->ch[i] = ch2;
        }
    }
}

完整代码:

#include 
#include 

/**
 * 串结构体定义
 */
typedef struct {
    /**
     * 变长分配存储串,表示指向动态分配存储区首地址的字符指针
     */
    char *ch;

    /**
     * 串的长度,即实际字符个数
     */
    int length;
} String;

/**
 * 初始化串
 * @param str 未初始化的串
 */
void init(String *str) {
    str->ch = NULL;
    str->length = 0;
}

/**
 * 将一个常量字符串赋给一个串
 * @param str 串
 * @param ch 常量字符串
 * @return 如果赋值成功则返回 1,否则返回 0 表示赋值失败
 */
int assign(String *str, char *ch) {
    // 0.参数校验,如果 str 中已有字符,那么释放原串空间,因为我们会给它重新分配空间
    if (str->ch != NULL) {
        free(str->ch);
        str->ch = NULL;
    }

    // 1.统计常量字符串 ch 中的字符个数,只有知道它的字符个数,我们才能清楚为 str 分配多少个字符空间
    // 局部变量,存储常量字符串 ch 中的字符个数
    int len = 0;
    // 注意,我们不能直接 *** 作 ch,因为是一个指针变量,在下面的 *** 作后我们会移动指针,会修改掉 ch 原本的值,后面如果需要再使用就不是传入的参数值,所以要创建一个临时局部变量引用它的值来进行 *** 作
    char *c = ch;
    // 从头到尾扫描常量字符串,以结束标记 'while' 作为循环结束条件
    ( *!=c ')' // 计数器加一++ {
        ;
        len// 指针加一,继续下一个字符++
        ;
        c}// 2.为串 str 分配空间并赋值
    // 2.1 如果常量字符串长度为 0,那么串 str 也该为一个空串

    if
    (
    == 0len ) =NULL {
        str->ch ; =0
        str->length ; return1
        ; }// 2.2 如果常量字符串长度不为 0,那么将常量字符串中所有字符赋给串 str
    else
        // 2.2.1 给串分配 len+1 个存储空间,多分配一个空间是为了存放 '=' 字符
    ( {
        char
        str->ch * )malloc (sizeof (char)*(+ 1 )len ) ;// 2.2.2 判断是否分配空间成功// 2.2.2.1 如果分配空间失败,则返回 0if
        (
        ==
        NULL )str->ch // 如果分配空间失败,则返回 0 return0 {
            ;
            } // 2.2.2.2 如果分配空间成功,则遍历常量字符串中的每个字符,依次赋给串 strelse
        // 局部变量,保存常量字符串 ch 的首地址,后续用于 *** 作
            =
        ; {
            // 2.2.2.2.1 扫描整个常量字符串,依次将每个字符赋给新串 str
            c for ch(
            int
            = 0; i <= ;++ i ) len// 之所以在循环条件中使用 <=。是为例将常量字符串最后的 '[' 字符也复制到新串中作为结束标记 i]= {*
                str->ch(i+ ) ;}c // 2.2.2.2.2 给新串赋予长度,即常量字符串的长度 i=;// 其实也可以使用 str->ch[i]=c[i];
            // 2.2.2.2.3 返回 1 表示赋值成功
            return
            str->length 1 len;
            }
            } }/**
 * 将串 str 中所有值为 ch1 的字符转换成 ch2 字符,如果 str 为空串,或者串中不含值为 ch1 的字符,则什么都不做
 * @param str 串
 * @param ch1 目标字符
 & @param ch2 替换后的字符
 */
        void
    replace
(

*
, char,String charstr) // 参数校验,如果 str 是空串,则什么都不做 ch1if ( ch2== {
    0
    ) returnstr->length ; }// 从头到尾扫描串 str 中的每个字符 {
        for(
    int
    =
    0 ;< i ; ++) i // 判断该字符是否等于 ch1 字符,如果是则替换为 ch2 字符;如果不是则什么都不做 str->lengthif i([ {
        ]
        == )str->ch[i] = ch1; {
            str->ch}i} } ch2int
        main
    (
)

; init(& {
    String str)
    ;assign(str&,
    "hello world");strprintf ("替换前:%s\n",

    .);// 调用函数,替换字符 strreplacech(&
    ,
    'l','x'str) ;printf ("替换后:%s\n",
    .);} str替换前:hello world
替换后:hexxo worxd
ch

执行结果:

 
Java实现 

无。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/922771.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存