C - 在大写字母和数字的输入字符串中添加空格,但有一些例外

中广域网

我正在用 C 编写一个函数(不是 C++,这将在较旧的计算机上运行),它应该接受输入 char* 并根据字母大写和数字为其添加空格,然后返回结果。由于平台限制,我恐怕不能使用字符串及其函数。

例如,输入“TestingThisPieceOfText”应返回为“Testing This Piece Of Text”。

我有一些(目前相当粗糙)代码适用于这样的简单情况,但我想为规则添加一些例外,这就是我需要帮助的地方:

  • 如果多个大写字母在一个序列中,则不应以空格分隔。例如,“APB”应保持原样。
  • 如果输入字符串中有数字,则之前(和之后)应该有一个空格,但它们之间没有。例如,“A10TankKiller2Disk”应返回为“A10 Tank Killer 2 Disk”。
  • “Mc”的特殊情况,涵盖可能发送此类名称的情况。例如,“ScroogeMcDuckIsFilthyRich”应返回为“Scroodge McDuck Is Filthy Rich”。

这是目前的功能(就像我说的,现在有点粗糙):

char* add_spaces_to_string(const char* input)
{
    char input_string[100];
    strcpy(input_string, input);

    char* output = (char*)malloc(sizeof input_string * 2);

    const char capitals[] = "ABCDEFGHIJKLMOPQRSTVWXYZ";
    const char numbers[] = "1234567890";
    const char mc[] = "Mc";

    // Special case for the first character, we don't touch it
    output[0] = input_string[0];

    unsigned int output_index = 1;
    unsigned int capital_found = 0;
    unsigned int number_found = 0;
    for (unsigned int input_index = 1; input_string[input_index] != '\0'; input_index++)
    {
        for (int capitals_index = 0; capitals[capitals_index] != '\0'; capitals_index++)
        {
            if (capitals[capitals_index] == input_string[input_index] 
                && capital_found < input_index - 1
                && number_found < input_index - 1)
            {
                capital_found = input_index;
                //printf("Found a capital character (%c), in position %u. Adding a space.\n", input_string[i], i);
                output[output_index] = ' ';
                output_index++;
                output[output_index] = input_string[input_index];
            }
        }

        for (int numbers_index = 0; numbers[numbers_index] != '\0'; numbers_index++)
        {
            if (numbers[numbers_index] == input_string[input_index] 
                && capital_found < input_index - 1
                && number_found < input_index - 1)
            {
                number_found = input_index;
                output[output_index] = ' ';
                output_index++;
                output[output_index] = input_string[input_index];
            }
        }
        output[output_index] = input_string[input_index];
        output_index++;
    }
    output[output_index] = '\0';

    return output;
}

有了上面,简单的例子像

"AnotherPieceOfTextWithoutSpaces" 

正确转换为

"Another Piece Of Text Without Spaces"

但更复杂的,比如

"A10TankKiller2Disk" 

不是 - 它返回

"A1 0Tank Killer 2Disk" 

在这种情况下。

所以问题是,为什么我在我不想要的位置获得空间,而没有将它们放在我想要的位置(基于我上面提到的规则)?

任何指向正确方向的指针将不胜感激!:)

中广域网

编辑:大写和数字的检测比必要的复杂。此外,它会在不正确的位置添加一个空格,当一个数字跟随另一个数字时,以及当一个大写字母跟随一个数字时。

我重写了该函数,使用了 2 个受支持的辅助函数 - isdigit() 和 isupper()。这似乎使它现在起作用:

char* add_spaces_to_string(const char* input)
{
    char input_string[100];
    strcpy(input_string, input);

    char* output = (char*)malloc(sizeof input_string * 2);
    const char mc[] = "Mc";

    // Special case for the first character, we don't touch it
    output[0] = input_string[0];

    unsigned int output_index = 1;
    unsigned int input_index = 1;
    unsigned int capital_found = 0;
    unsigned int number_found = 0;
    while (input_string[input_index])
    {
        if (isdigit(input_string[input_index]))
        {
            if (number_found < input_index - 1)
            {
                output[output_index] = ' ';
                output_index++;
                output[output_index] = input_string[input_index];
            }
            number_found = input_index;
        }

        else if (isupper(input_string[input_index]))
        {
            if (capital_found < input_index - 1)
            {
                output[output_index] = ' ';
                output_index++;
                output[output_index] = input_string[input_index];
            }
            capital_found = input_index;
        }

        output[output_index] = input_string[input_index];
        output_index++;
        input_index++;
    }
    output[output_index] = '\0';

    return output;
}

我仍然需要为“Mc”的情况添加一个特殊规则,但这对我来说是一个小问题,我稍后会添加。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在c中连接两个单独字符串的大写字母

来自分类Dev

C ++为什么大写字母会与字符串进行比较(对名称进行排序)

来自分类Dev

C#string.split()用大写字母分隔字符串

来自分类Dev

C-从字符串中提取大写字母

来自分类Dev

Python:在大写字母之前在字符串中添加空格的有效方法

来自分类Dev

尝试制作一个程序来检查密码是否包含大写字母和c中的数字

来自分类Dev

在 SAS 中,如何在宏字符串的每个大写字母前添加空格?

来自分类Dev

测试字符串或字符的大写,小写和数字C ++

来自分类Dev

SQL:多字符串替换(在第二个大写字母开头的大写字母前添加一个空格)

来自分类Dev

如何在非连续大写字母之前在字符串中添加空格,同时排除连续大写字母?

来自分类Dev

为什么var在C#中没有大写字母(Var)?

来自分类Dev

逻辑上将大写字母和数字的混合字符串排序

来自分类Dev

逻辑上将大写字母和数字的混合字符串排序

来自分类Dev

如何查找字符串是否包含大写字母和数字

来自分类Dev

如何在大写字母或真正需要空格的字符串中添加空格

来自分类Dev

有一些访问C多维数组中的字符串的特定方法吗?

来自分类Dev

用C大写字符串

来自分类Dev

字符串长度、大写字母个数和字符串中的数字个数

来自分类Dev

在大写字母或数字上分割字符串

来自分类Dev

有没有更好的方法从C#中的大写字母创建首字母缩写词?

来自分类Dev

以大写字母拆分字符串,但前提是没有空格

来自分类Dev

字符串中的PHP大写字母

来自分类Dev

从字符串中删除大写字母

来自分类Dev

C ++-在字符串中添加空格

来自分类Dev

Javascript:在字符串中,替换大写字母及其后的所有字母

来自分类常见问题

如何在Python中缩短字符串(但有一些例外)?

来自分类Dev

如何在Python中缩短字符串(但有一些例外)?

来自分类Dev

以数字结尾的命令字符串,但有一些以非数字字符结尾的例外

来自分类Dev

仅针对字母和空格验证 C++ 中的字符串输入

Related 相关文章

  1. 1

    在c中连接两个单独字符串的大写字母

  2. 2

    C ++为什么大写字母会与字符串进行比较(对名称进行排序)

  3. 3

    C#string.split()用大写字母分隔字符串

  4. 4

    C-从字符串中提取大写字母

  5. 5

    Python:在大写字母之前在字符串中添加空格的有效方法

  6. 6

    尝试制作一个程序来检查密码是否包含大写字母和c中的数字

  7. 7

    在 SAS 中,如何在宏字符串的每个大写字母前添加空格?

  8. 8

    测试字符串或字符的大写,小写和数字C ++

  9. 9

    SQL:多字符串替换(在第二个大写字母开头的大写字母前添加一个空格)

  10. 10

    如何在非连续大写字母之前在字符串中添加空格,同时排除连续大写字母?

  11. 11

    为什么var在C#中没有大写字母(Var)?

  12. 12

    逻辑上将大写字母和数字的混合字符串排序

  13. 13

    逻辑上将大写字母和数字的混合字符串排序

  14. 14

    如何查找字符串是否包含大写字母和数字

  15. 15

    如何在大写字母或真正需要空格的字符串中添加空格

  16. 16

    有一些访问C多维数组中的字符串的特定方法吗?

  17. 17

    用C大写字符串

  18. 18

    字符串长度、大写字母个数和字符串中的数字个数

  19. 19

    在大写字母或数字上分割字符串

  20. 20

    有没有更好的方法从C#中的大写字母创建首字母缩写词?

  21. 21

    以大写字母拆分字符串,但前提是没有空格

  22. 22

    字符串中的PHP大写字母

  23. 23

    从字符串中删除大写字母

  24. 24

    C ++-在字符串中添加空格

  25. 25

    Javascript:在字符串中,替换大写字母及其后的所有字母

  26. 26

    如何在Python中缩短字符串(但有一些例外)?

  27. 27

    如何在Python中缩短字符串(但有一些例外)?

  28. 28

    以数字结尾的命令字符串,但有一些以非数字字符结尾的例外

  29. 29

    仅针对字母和空格验证 C++ 中的字符串输入

热门标签

归档