C - 在大写字母和数字的输入字符串中添加空格,但有一些例外
C - Add spaces to input string on capital letters and numbers, with some exceptions
我正在用 C 编写一个函数(不是 C++,这将在旧计算机上 运行),它应该接受一个输入 char* 并向其添加 spaces,基于字母大写和数字,然后 return 结果。由于平台限制,我恐怕无法使用字符串及其函数。
例如,输入 "TestingThisPieceOfText" 应该 return 编辑为 "Testing This Piece Of Text"。
我有一些(目前相当粗糙)适用于像这样的简单情况的代码,但我想在规则中添加一些例外情况,这就是我需要帮助的地方:
- 如果多个大写字母在一个序列中,则不应使用 space 分隔它们。例如,"APB" 应保持原样。
- 如果输入字符串中有数字,则前(后)间应该有一个space,但中间没有。例如,"A10TankKiller2Disk" 应该 return 编辑为 "A10 Tank Killer 2 Disk"。
- "Mc" 的特例,以涵盖可能会发送此类名称的情况。例如,"ScroogeMcDuckIsFilthyRich" 应 return 编辑为 "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] != '[=10=]'; input_index++)
{
for (int capitals_index = 0; capitals[capitals_index] != '[=10=]'; 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] != '[=10=]'; 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] = '[=10=]';
return output;
}
有了上面的简单例子,比如
"AnotherPieceOfTextWithoutSpaces"
正确转换为
"Another Piece Of Text Without Spaces"
但更复杂的,比如
"A10TankKiller2Disk"
不是 - 它 returns
"A1 0Tank Killer 2Disk"
在那种情况下。
所以问题是,为什么我得到 space 我不想要的位置,而不是我想要的位置(根据我上面提到的规则)?
任何指向正确方向的指示将不胜感激! :)
编辑:大写和数字的检测比必要的更复杂。此外,它会在不正确的位置添加 space 的例程,当一个数字跟随另一个数字时,以及当一个大写字母跟随一个数字时。
我重写了该函数,使用了 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] = '[=10=]';
return output;
}
对于"Mc"的情况,我还需要添加一条特殊规则,但这对我来说是个小问题,我会稍后添加。
我正在用 C 编写一个函数(不是 C++,这将在旧计算机上 运行),它应该接受一个输入 char* 并向其添加 spaces,基于字母大写和数字,然后 return 结果。由于平台限制,我恐怕无法使用字符串及其函数。
例如,输入 "TestingThisPieceOfText" 应该 return 编辑为 "Testing This Piece Of Text"。
我有一些(目前相当粗糙)适用于像这样的简单情况的代码,但我想在规则中添加一些例外情况,这就是我需要帮助的地方:
- 如果多个大写字母在一个序列中,则不应使用 space 分隔它们。例如,"APB" 应保持原样。
- 如果输入字符串中有数字,则前(后)间应该有一个space,但中间没有。例如,"A10TankKiller2Disk" 应该 return 编辑为 "A10 Tank Killer 2 Disk"。
- "Mc" 的特例,以涵盖可能会发送此类名称的情况。例如,"ScroogeMcDuckIsFilthyRich" 应 return 编辑为 "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] != '[=10=]'; input_index++)
{
for (int capitals_index = 0; capitals[capitals_index] != '[=10=]'; 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] != '[=10=]'; 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] = '[=10=]';
return output;
}
有了上面的简单例子,比如
"AnotherPieceOfTextWithoutSpaces"
正确转换为
"Another Piece Of Text Without Spaces"
但更复杂的,比如
"A10TankKiller2Disk"
不是 - 它 returns
"A1 0Tank Killer 2Disk"
在那种情况下。
所以问题是,为什么我得到 space 我不想要的位置,而不是我想要的位置(根据我上面提到的规则)?
任何指向正确方向的指示将不胜感激! :)
编辑:大写和数字的检测比必要的更复杂。此外,它会在不正确的位置添加 space 的例程,当一个数字跟随另一个数字时,以及当一个大写字母跟随一个数字时。
我重写了该函数,使用了 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] = '[=10=]';
return output;
}
对于"Mc"的情况,我还需要添加一条特殊规则,但这对我来说是个小问题,我会稍后添加。