gpt4 book ai didi

C- 将 realloc 与字符串指针合并

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:12 24 4
gpt4 key购买 nike

我正在研究有关使用动态内存分配修改字符串的问题。我的代码的适用部分如下:

./dma 5
#include <stdio.h>
#include <stdlib.h>

char* strcopy(char* destination, char* source);
char *strconcat(char* destination, char* source);

int main(int argc, char *argv[]) {

int cmd, a=1, b, length_of_str, n, n2;
char* pstring[atoi(argv[1])];

for (b=0; b<atoi(argv[1]); b++) {
printf("Enter the length of string %d: ", b+1);
scanf("%d", &length_of_str);
pstring[b]=(char *)malloc(length_of_str*sizeof(char));
printf("Please enter string %d: ", b+1);
scanf("%s", &pstring[b]);
}

while (a!=0) {
printf("Your strings are: \n");
for (b=0; b<atoi(argv[1]); b++) {
printf("String number %d - \"%s\"\n", b+1, &pstring[b]);
}

printf("Options:\n");
printf("1 - Find string length\n");
printf("2 - Compare strings\n");
printf("3 - Copy strings\n");
printf("4 - Concatenate strings\n");
printf("5 - Quit\n");
printf("Please enter your option: ");
scanf("%d", &cmd);

switch (cmd) {

case 3:
printf("Enter the number of the source string: ");
scanf("%d", &n);
printf("Enter the number of the destination string: ");
scanf("%d", &n2);
strcopy(pstring[n-1], pstring[n2-1]);
break;
case 4:
printf("Enter the number of the source string: ");
scanf("%d", &n);
printf("Enter the number of the destination string: ");
scanf("%d", &n2);
strconcat(pstring[n-1], pstring[n2-1]);
break;
case 5:
a=0;
break;
default:
printf("Invalid Option.\n");
break;
}
}

free(pstring);
return 0;
}
char* strcopy(char* destination, char* source) {
destination=(char *)realloc(*source, sizeof(char)*strlength(destination));
for (; *source!='\0'; source++) {
*destination=*source;
destination++;
}
*destination='\0';
return destination;
}

char* strconcat(char* destination, char* source) {
destination=(char *)realloc(*source, sizeof(char)*strlength(destination));
for (; *destination!='\0'; destination++) {
}
for (; *source!='\0'; source++) {
*destination=*source;
destination++;
}
*destination='\0';
return destination;
}

我需要将 realloc 合并到我的串联和复制函数中(这应该没问题,因为它们在一个单独的问题中工作)。我尝试了多种方法并尝试了不同的语法,但我似乎只遇到段错误或无效指针。我究竟应该如何合并 realloc?预期结果应如下所示:

Your strings are:
String number 1 – “first”
String number 2 – “second”
String number 3 – “third”
String number 4 – “fourth”
String number 5 – “fifth”
Options:
1 – Find string length
2 – Compare strings
3 – Copy strings
4 – Concatenate strings
5 – Quit
Please enter your option: 3
Enter the number of the source string: 2
Enter the number of the destination string: 5
Your strings are:
String number 1 – “first”
String number 2 – “second”
String number 3 – “third”
String number 4 – “fourth”
String number 5 – “second”
Options:
1 – Find string length
2 – Compare strings
3 – Copy strings
4 – Concatenate strings
5 – Quit
Please enter your option:

最佳答案

一个主要问题是您如何读取字符串:

scanf("%s", &pstring[b])

这里 pstring[b]char * 类型,由于 malloc 调用它指向一些内存(除非 malloc 失败,你忘了检查)。

但是 &pstring[b] 是一个指向指针的指针,类型为字符 **。这几乎不是您想要的,并且会导致 scanf 写入内存中它不应该写入的地方,甚至可能超出分配的内存范围。这当然会导致 undefined behavior .

一旦你解决了这个问题,你需要记住 C 中的 char 字符串实际上称为 null-terminated 字节字符串null-terminator 是所有标准字符串函数寻找字符串结尾的地方。当然,这意味着 x 个字符的字符串需要 x + 1 的空间来适应终止符。因此,如果用户说他或她想要一个长度为 6 的字符串(例如),然后将 foobar 作为输入,则需要 7 的空间 带有终止符的字符。您在其他地方(例如 strcopy 函数)也有这个终结符问题(或者更确切地说,缺少为其分配空间)。

您的 scanf 调用也不会妨碍用户输入比用户所说的更长的字符串。如果用户说字符串应该是 3 个字符,但随后输入 foobar,就会写出边界。不幸的是,仅使用 scanf 无法解决此问题,因为字段宽度修饰符必须是格式字符串的一部分。您可以使用 scanf_s 函数来解决这个问题,但它不是 C 规范的强制要求,并且需要您定义一个特定的宏才能在实现中使用它(请参阅 e.. g this scanf and family reference 了解详情)。否则,您需要以编程方式构造格式字符串以包含字段宽度。

执行了无效的free(pstring),因为您没有分配pstring 本身,它是一个数组。您确实需要遍历 in 数组 pstring 中的所有字符串并 free 它们。尝试将 malloc(等)未返回的指针传递给 free 也会导致未定义的行为

最后,在C你should not cast the result of malloc (and related functions) .

关于C- 将 realloc 与字符串指针合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53626724/

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