我需要将" "
(空格)替换为", "
(逗号和空格)。我具有接收字符串作为char *的功能,并且替换所有这些字符后,将在屏幕上显示字符串。
char* PrintComma(char* Text) {
for (int i = 0; i < strlen(Text); i++) {
if (Text[i] == ' ') {
Text[i] = ',';
}
}
return Text;
}
此将" "
替换为","
,但我需要", "
。我不允许使用第二个字符串或数组来保存临时数据。我只能使用这一个字符串。
示例:
Input => "Hello world my name is"
Output => "Hello, world, my, name, is"
这是一个可行的例子。输入缓冲区必须足够大以存储替换的字符串,因为要求指出不应创建任何新字符串。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void PrintComma(char* Text)
{
char* str = Text;
size_t c, len = strlen(Text);
for (c = 0; Text[c]; Text[c] == ' ' ? c++ : *Text++);
for (size_t i = 0; i < len + c; i++)
{
if (str[i] == ' ')
{
str[i] = ',';
char last = ' ';
for(size_t u = i + 1; u < len + c; u++)
{
char current = str[u];
str[u] = last;
last = current;
}
i += 2;
}
}
}
int main(void)
{
char tmp[100] = { 0 };
const char* TEST = "Hello world my name is";
memcpy(tmp, TEST, strlen(TEST));
printf("Input: %s\n", tmp);
PrintComma(tmp);
printf("Output: %s\n", tmp);
return 0;
}
结果:
Input: Hello world my name is
Output: Hello, world, my, name, is
此问题似乎是memmove()的理想设置,memmove()是一种库函数,可以在两个字符串之间复制字节,但可以处理重叠的内存块。
memmove(
char_pointer + make_room_at + room_to_make,
char_pointer + make_room_at,
init_size - make_room_at + room_to_make
);
这里是使用memmove()的应用程序。
char* PrintComma(char* Text) {
for (int i = 0; i < strlen(Text); i++) {
if (Text[i] == ' ') {
memmove(
Text + i + 1,
Text + i,
strlen(Text) - i + 1
);
Text[i++] = ',';
}
}
return Text;
}
这应该是我猜到的把戏。
char *PrintComma(char *Text) {
int numberOfSpaces = 0;
char *requiredString;
for (int i = 0; i < strlen(Text); i++) {
if (Text[i] == ' ')
numberOfSpaces++;
}
requiredString =
(char *)malloc(sizeof(char) * (numberOfSpaces + strlen(Text)));
for (int i = 0, j = 0; i < strlen(Text); i++) {
if (Text[i] == ' ') {
requiredString[j] = ',';
j++;
}
requiredString[j] = Text[i];
j++;
}
return requiredString;
}