gpt4 book ai didi

使用动态函数复制字符串

转载 作者:行者123 更新时间:2023-11-30 14:35:34 27 4
gpt4 key购买 nike

我正在尝试将一个字符串复制到另一个字符串中。面临最终输出的问题。请引用预期输出和实际输出。

这是为了在另一个字符串之间复制一个字符串。

#include <stdio.h>
#include <stdlib.h>

int main()
{
int n1, n2, loc;
char *p1, *p2, *output;

printf("Enter size of p1: ");
scanf("%d", &n1);

p1 = malloc(n1 * sizeof(char));

printf("Enter the P1 String: ");
scanf("%s", p1);

printf("\nEnter the size of p2: ");
scanf("%d", &n2);

p2 = malloc(n2 * sizeof(char));

printf("Enter the P2 String: ");
scanf("%s", p2);

printf("\nEnter the Location to copy: ");
scanf("%d", &loc);

output = realloc(p1, sizeof(char) * (n1 + n2));

for (int i = loc - 1; i <= n1; i++)
*(output + i + n2) = *(p1 + i);

for (int i = 0; i < n2; i++)
*(output + i + loc) = *(p2 + i);

printf("\nFinal copy is: ");
printf("%s\n", output);

free(p1);
free(p2);
free(output);

return 0;
}

预期 I&O/P:

Size of string: 6
Enter string: google
size of 2nd string: 6
Enter string: amazon
Location to copy: 2
Final copy: goamazonogle

实际 I&O/P:

Size of string: 6
Enter string: google
size of 2nd string: 6
Enter string: amazon
Location to copy: 2
Final copy: goamazonW //Here W is the unknown value is printing instead of "ogle".

最佳答案

sizeof(char) 始终为 1。您可以通过消除它来简化代码。

一旦知道要读取的字符串的大小,就无法使用 scanf(3) 将其读取的输入限制为您分配的缓冲区的大小。一般来说,我们不依赖输入来准确地描述自身。

在您的情况下,即使描述准确,代码也不准确:scanf promise 以 NUL 字符终止 %s 读取的字符串,因此您的 6 字节输入需要一个7 字节缓冲区来容纳 NUL。这是一个错误。

有一种奇特的方法可以让 scanf 为您分配字符串内存。不过,传统上,您可以使用 getline(3) 来实现此目的,并使用 strlen(3) 来了解它读取了多少内容。

正如一条评论指出的那样,realloc(3) 使其第一个参数无效,这意味着在该调用之后不能依赖 p1。您确实希望 output 成为一个单独的缓冲区,您可以将 p1p2 中的数据复制到其中。

但是,一旦分配了输出缓冲区,您可能会惊讶地发现 sprintf(3) 是您的 friend 。对该函数的一次调用(使用 %.*s 结构来动态限制字符串输出以及对输入进行指针算术)将生成您需要的内容。

关于使用动态函数复制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58466235/

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