描述
将一个字符串中所有的整数前后加上符号“*”,其他字符保持不变。连续的数字视为一个整数。
数据范围:字符串长度满足 1≤n≤100
输入描述:
输入一个字符串
输出描述:
字符中所有出现的数字前后加上符号“*”,其他字符保持不变
示例1
输入:
Jkdi234klowe90a3
输出:
Jkdi*234*klowe*90*a*3*
#include <stdio.h> #include <string.h> //以下是Senky的代码: //算法写在前面: //pre_isnum是当前一个元素n[i]的前一个元素是不是数字的判断标记 //①前一个不是数字,当前n[i]是数字,那就要输出‘*’再输出n[i] //②前一个是数字,当前n[i]不是数字,那也要输出‘*’再输出n[i] //③前一个是数字,当前n[i]是数字,输出n[i] //④前一个不是数字,当前n[i]不是数字,输出n[i] //此算法可以处理前len-1个字符的关系,如果最后一个字符是数字就补一个‘*’ void start() { char n[100]; scanf("%[^\n]", n); int len = strlen(n); //字符串长度 int i = 0;//下标从0开始 int pre_isnum = 0;//第一个元素前面默认不是数字,初始化为0 for (i = 0; i < len; i++) {//循环遍历字符串 if (n[i] >= '0' && n[i] <= '9') {//n[i]是数字 if (pre_isnum == 0) printf("*"); //①输出*号 printf("%c", n[i]);//输出n[i] pre_isnum = 1;//进入下一轮循环时标记置为1 } else {//进入else说明n[i]不是数字 if (pre_isnum == 1) printf("*"); //②输出*号 printf("%c", n[i]);//输出n[i] pre_isnum = 0;//进入下一轮循环时标记置为0 } if (i == len - 1 && n[i] >= '0' && n[i] <= '9') printf("*"); //处理最后一个字符 } } int main() { start(); return 0;//编辑于2022/10/11 }解法二代码部分:
#include <stdio.h> #include <string.h> //以下是Senky的代码: //算法写在前面: //把字母和数字看做两种类型,那么两种类型交接处必定会有'*' //设计一个函数判断交接处 //①数字 字母: 则输出 n[i-1] * n[i] //②字母 数字: 则输出 n[i-1] * n[i] //③数字 数字 || 字母 字母:则先输出n[i-1] n[i] //依次输出字符,遇到交接面就输出'*' int is_number(char now) { int ret = 0; //默认不是数字 if (now >= '0' && now <= '9') ret = 1; //是数字则返回1不是就返回0 return ret; } void start() { char n[100]; scanf("%[^\n]", n); int len = strlen(n); //字符串长度 int i = 0;//下标从0开始 if (is_number(n[i])) printf("*");//处理第一个字符 for (i = 1; i < len + 1; i++) { //循环遍历字符串 printf("%c", n[i - 1]);//依次输出字符 //异或运算,同0异1,为1是交接面 if (is_number(n[i])^is_number(n[i - 1])) { printf("*");//输出‘*’ } } } int main() { start(); return 0;//编辑于2022/10/11 }
总结:
①解法一很妙,有点操作系统信号量机制的味道 ;
②解法二的数组越界的时候判断is_number(n[len])结果为0,即可以认为越界元素不是数字;
③当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;