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

时间:2018-08-16 08:52:15

标签: c char spaces

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

例如,输入“ TestingThisPieceOfText”应作为“测试此文本”返回。

我有一些(现在还算是粗略的)代码适用于这样的简单情况,但是我想在规则中添加一些例外,这就是我需要帮助的地方:

  • 如果序列中有多个大写字母,则不应将它们用空格分隔。例如,“ 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" 

在这种情况下。

所以问题是,为什么我要在我不想要的位置上获得空间,而又没有在我想要的位置上获得空间(基于上述规则)?

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

1 个答案:

答案 0 :(得分:0)

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

我使用2个受支持的辅助函数-isdigit()和isupper()重新编写了该函数。这似乎使其暂时可用:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int)

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