gpt4 book ai didi

c - 我制作的这个函数是否正确地将一个字符串附加到另一个字符串?

转载 作者:行者123 更新时间:2023-11-30 21:07:30 25 4
gpt4 key购买 nike

我昨晚凌晨 3 点开始编码,今天醒来,在源文件中找到了这个:(脏话已编辑)

void append_this_stuff(char *stuff_to_append_to[], char **stuff_to_append, int position) {
char the_actual_stuff[] = *(stuff_to_append_to);
char *screw_me = *(stuff_to_append);

int someNumber = strlen(screw_me);

int j = 0;
for (int i = position; i < (someNumber + position - 1); i++) {
the_actual_stuff[i] = (screw_me + j);
j++;
}

stuff_to_append_to = &the_actual_stuff;
}

当我尝试编译它时,出现此错误:

<project root>/src/brstring.c: In function ‘append_this_stuff’:
<project root>/src/brstring.c:38:28: error: invalid initializer
char the_actual_stuff[] = *(stuff_to_append_to);
^
<project root>/src/brstring.c:46:24: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
the_actual_stuff[i] = (screw_me + j);
^
<project root>/src/brstring.c:50:21: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
stuff_to_append_to = &the_actual_stuff;

有人知道我这样做是否正确吗?我正在通过 C99 标准和 cmake 进行编译,并且我正在 Fedora Linux 上使用 GCC,这是否会影响任何内容。

最佳答案

首先,char *stuff_to_append_to[] 是一个长度不确定的指针数组,这不是一个有效的参数,因为必须指定数组的最后一个维度当传递给函数时,否则传递一个指向类型的指针。

接下来,char **stuff_to_append 是一个指向 char 的指针并且完全有效,但考虑到您在函数,很明显这不是你想要的。

如果您希望在 stuff_to_append 末尾插入 stuff_to_append截断 stuff_to_append_to code> 只需传递一个指向每个字符串的指针作为参数。虽然intposition很好,但选择无符号值可能更好,因为您不会在数组索引处插入。

在函数内部,您必须验证 stuff_to_append_to 中有足够的空间来容纳从索引 position 开始的 stuff_to_append(包括 position 的空间) em>空字节)

考虑到这一点,您可能需要执行以下操作:

void append_this_stuff (char *stuff_to_append_to, char *stuff_to_append, 
int position)
{
int somenumber = strlen (stuff_to_append),
lento = strlen (stuff_to_append_to),
end = position + somenumber;

if (end > lento) {
fprintf (stderr, "error: insufficient space in stuff_to_append_to.\n");
return;
}

for (int i = position; i < end + 1; i++) /* +1 to force copy of nul-byte */
stuff_to_append_to[i] = stuff_to_append[i - position];
}

您可以编写一个小测试程序来确认其运行,例如

#include <stdio.h>
#include <string.h>
...
int main (void) {

char stuff[] = "my dog has fleas!",
append[] = "cat has none!";
int pos = 3;

printf ("original: %s\n", stuff);
append_this_stuff (stuff, append, pos);
printf (" new: %s\n", stuff);

return 0;
}

示例使用/输出

$ ./bin/append
original: my dog has fleas!
new: my cat has none!

要使用指针算术而不是使用数组索引来完成相同的操作,您可以重写append_this_stuff,类似于以下内容:

void ats (char *to, char *from, int p)
{
if (p + strlen (from) > strlen (to)) {
fprintf (stderr, "error: insufficient space in stuff_to_append_to.\n");
return;
}

for (to += p; *from; to++, from++)
*to = *from;
*to = *from;
}

最后,如果这一教训没有完全融入您的思维过程,“在面试第一个编程职位时,切勿发布任何您不希望招聘人员收到的内容。”使用不专业或可爱的变量名称虽然可能表达您的挫败感,但可能不会给别人留下您想要的印象。说得够多了。

关于c - 我制作的这个函数是否正确地将一个字符串附加到另一个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43422030/

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