【发布时间】:2025-11-28 17:45:02
【问题描述】:
我正在用 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"
在那种情况下。
所以问题是,为什么我会在我不想要的位置上获得空格,而不是在我想要的位置上(根据我上面提到的规则)?
任何指向正确方向的指针将不胜感激! :)
【问题讨论】:
-
你可以使用 Flex&Bison 吗?
-
我不明白为什么“A10TankKiller2Disk”应该返回为“A10 Tank Killer 2 Disk”而不是“A 10 Tank Killer 2 Disk”。您关于处理数字的规范看起来不完整。但无论如何,这个问题太宽泛了。
-
提示:我认为你应该从头开始重写函数并引入两个辅助函数(你需要编写)
int IsCapitalLetter(char c)和int IsDigit(char c)。 -
输入字符串的第一个字符总是被跳过(参见示例代码中的相关行),这就是为什么A10 Tank Killer 2 Disk应该看起来像这样(“A”将是第一个字符,并且“1”将是第一个数字,因此不会添加空格)。我现在正在考虑编写辅助函数,谢谢
-
@MiDWaN 如果序列是“aaABbb”,结果是什么?还有“Mc10MM”? AAMcMM" ?如果您在执行您的功能时遇到问题,也许可以开始寻找“有限状态机”。即使您不使用它,它也可以帮助您有一个干净的方法。