gpt4 book ai didi

c++ - 数组转换指导

转载 作者:行者123 更新时间:2023-11-28 01:48:40 25 4
gpt4 key购买 nike

我被困在一个将数组内容(来自用户的输入)转换为预先声明的速记的赋值上。

我希望它像 strcpy("and ", "+") 这样简单;将字符串中的单词“and”更改为“+”符号。

不幸的是,无论我如何构建函数;我收到弃用的转换警告(尝试了变体循环和直接应用程序)。

边注;这是基于赋值的,所以我的字符串快捷方式受到严格限制,并且没有指针(我已经看到使用它们清除故障的几个版本)。

我不是在找人帮我做作业;只是关于如何在不创建 dep 的情况下应用 strcpy 的指导。警告。也许我根本不应该使用 strcpy?

最佳答案

strcpy 将第二个字符串的内容复制到第一个字符串的内存中。由于您正在将字符串文字复制到字符串文字中,因此它无法执行此操作(您无法写入字符串文字),因此它会提示。

相反,您需要构建自己的搜索和替换系统。您可以使用 strstr() 搜索字符串中的子字符串,并将内存中的指针返回到找到的字符串的开头(如果找到)。

让我们以示例字符串Jack and Jill went up the hill为例。

char *andloc = strstr(buffer, " and ");

这将返回字符串开头的地址(比如 0x100)加上单词“和”(包括空格)在其中的偏移量(0x100 + 4) 这将是 0x104

然后,如果找到了,可以用&符号替换。但是,您不能为此使用 strcpy,因为它会终止字符串。相反,您可以手动设置字节,或使用 memcpy:

if (andloc != NULL) { // it's been found
andloc[1] = '&';
andloc[2] = ' ';
}

或:

if (andloc != NULL) { // it's been found
memcpy(andloc, " & ", 3);
}

这将导致 Jack & d Jill went up the hill。我们还没有到那一步。接下来,您必须将所有内容打乱以覆盖旧的“和”中的“d”。为此,您认为您现在可以使用 strcpymemcpy,但这是不可能的 - 字符串(源和目标)重叠,并且两者的手册页都明确指出字符串不能重叠并使用 memmove 代替。

因此您可以将“d”之后的字符串内容移动到“&”之后:

memmove(andloc + 3, andloc + 5, strlen(andloc + 5) + 1);

将一个数字添加到一个字符串中,就像这样添加到指针的地址中。因此,我们正在考虑将旧“and”位置的字符串中 5 个字符的数据复制到从旧“and”位置开始的 3 个字符开始的空格中。要复制的数量是字符串的长度,从“and”位置开始的 5 个字符加上 1,因此它复制字符串末尾的 NULL 字符。

另一种手动执行此操作的方法是遍历每个字符,直到找到字符串的末尾:

char *to = andloc + 3;
char *from = andloc + 5;
while (*from) { // Until the end of the string
*to = *from; // Copy one character
to++; // Move to the ...
from++; // ... next character pair
}
*to = 0; // Add the end of string marker.

所以无论哪种方式,字符串内存都包含:

Jack & Jill went up the hill\0l\0

\0 是字符串标记的结尾,所以实际的字符串“content”只到第一个 \0l\0 现在被忽略。

请注意,这仅在您用更小的零件替换零件时才有效。如果你用更大的东西替换它,所以字符串的大小增加,你将被迫使用 memmove,它首先将内容复制到暂存器,并确保你的缓冲区有足够的空间存储完成的字符串(这种事情通常是“缓冲区溢出”的一个重要来源,这是一个安全问题,也是系统被黑客攻击的最大原因之一)。此外,您还必须向后做整个事情 - 首先移动弦的后半部分以腾出空间,然后修改两半之间的间隙。

关于c++ - 数组转换指导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43859577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com