输入一个字符串strl,把其中的连续非数字的字符 子串换成一个*,存入字符数组str2中,所有数字字符也 必须依次存入str2中。输出str2。

输入一个字符串strl,把其中的连续非数字的字符
子串换成一个*,存入字符数组str2中,所有数字字符也
必须依次存入str2中。
输出str2。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
以下是C++语言的示例代码,实现输入一个字符串strl,把其中的连续非数字的字符子串换成一个*,存入字符数组str2中,所有数字字符也必须依次存入str2中,并输出str2。

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char str1[100], str2[100];
    int len, i, j = 0;
    bool last_is_digit = false;  // 上一个字符是否是数字

    cout << "请输入一个字符串:";
    cin.getline(str1, 100);

    len = strlen(str1);

    for (i = 0; i < len; i++) {
        if (isdigit(str1[i])) {
            str2[j++] = str1[i];
            last_is_digit = true;
        } else {
            if (last_is_digit) {
                str2[j++] = '*';
                last_is_digit = false;
            }
        }
    }

    if (last_is_digit) {
        str2[j++] = '*';
    }
    str2[j] = '\0';

    cout << "输出str2:" << str2 << endl;

    return 0;
}

在上述代码中,我们首先定义了两个字符数组str1str2,并使用cin.getline方法从控制台读取输入的字符串。然后,我们使用strlen方法获取字符串的长度,并使用一个循环遍历字符串中的每个字符。

在循环中,我们使用isdigit方法判断当前字符是否是数字,如果是数字,则将其存入str2数组中,并将last_is_digit标志设置为true;否则,如果上一个字符是数字,则将一个*存入str2数组中,并将last_is_digit标志设置为false

最后,我们再次检查last_is_digit标志,如果为true,则说明最后一个字符是数字,需要在str2数组末尾添加一个*

需要注意的是,上述代码中的str1str2数组长度为100,如果输入的字符串长度超过了100,会导致数组越界的问题。为了避免这种情况,可以使用动态内存分配或者使用更大的数组来存储字符串。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/334904
  • 你也可以参考下这篇文章:把字符串str1中所有子串str2替换为str3。
  • 除此之外, 这篇博客: C程序设计-方法与实践(清华大学出版社)习题解析中的 (3)输入两个字符串分别存放到字符数组str1和str2中,将str2中的字符串全部链接到str1中字符串的尾部,并将链接得到的更长的字符串存放在str1数组中(假设字符数组str1的长度足够大)。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include <stdio.h>
    int main() {
    	char str1[81], str2[40];
    	int i = 0, j = 0;
    	gets_s(str1, 80);
    	gets_s(str2, 39);
    	while (str1[i] != '\0')
    	{
    		/*第1个空*/i++;
    	}
    	while (/*第2个空*/str2[j] != '\0')
    	{
    		str1[i] = str2[j];
    		/*第3个空*/i++;
    		j++;
    	}
    	str1[i] = /*第4个空*/'\0';
    	puts(str1);
    	return 0;
    }
    

    总结:
    1.此题我将gets改为get_s,因为gets属于过时的一个字符串输入函数了,最大的问题就是安全性低,没办法限制输入的个数,容易溢出
    2.最后一个空str1[i] = '\0';这么填的目的是要把之前被替换的结束符给补上。

  • 以下回答来自chatgpt:

    问题: 如何将一个字符串中的连续非数字字符替换为一个星号,并将所有数字字符存入一个新的字符数组中输出?

    解决方案: 1. 定义一个函数,以字符串和新字符数组作为参数。 2. 循环字符串,判断当前字符是否为数字。 3. 如果是数字,则将其添加到新字符数组中,并将连续非数字字符串计数器重置为0。 4. 如果不是数字,则将连续非数字字符串计数器加1。 5. 如果连续非数字字符串计数器大于等于2,则将其替换为一个星号,并将计数器重置为1。 6. 输出新字符数组。

    代码实现如下:

    def process_string(s: str, new_arr: list):
        count = 0
        for i in range(len(s)):
            if s[i].isdigit():
                new_arr.append(s[i])
                count = 0
            else:
                count += 1
                if count >= 2:
                    new_arr.append('*')
                    count = 1
        return new_arr
    

    使用示例:

    s = 'a123b..c***d123***e'
    new_arr = []
    process_string(s, new_arr)
    print(new_arr) # ['1', '2', '3', '*', '*', '1', '2', '3', '*', '*', '*']
    

    注意,本解决方案中将连续非数字字符串替换为一个星号的逻辑为连续2个及以上。如果要替换为一个星号的条件更改为任意连续非数字字符,只需将第5步的判断条件改为count >= 1


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int i, j;
    char a[90], b[90];
    gets(a);
    j = 0;
    for(i = 0; a[i] != '\0'; i++)
    {
        if(a[i] >= '0' && a[i] <= '9')
            b[j++] = a[i];
        else
        {
            a[i] = '*';
            if(a[i - 1] != '*')
                b[j++] = a[i];
        }
    }
    puts(b);
    return 0;
}