gpt4 book ai didi

c - 使用 malloc 动态分配字符串

转载 作者:行者123 更新时间:2023-12-04 18:36:10 26 4
gpt4 key购买 nike

我是 C 编程的新手。现在我正在学习字符串和指针。
作为初学者,我发现很难找到错误。我已经编写了动态分配字符串的代码,并使用函数打印字符串。代码如下。

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

void fun (char *);

int main()
{
int n;
char *s = NULL;
printf("enter the length of the string\n");
scanf("%d",&n);
s = (char*)malloc(n * sizeof(char));
printf("enter the string\n");
fgets(s, 20, stdin);
printf("string before passing is %s\n",s);
fun(s);
return 0;
}

void fun( char *p)
{
char *d;
d = p;
printf("string after passing is%s\n",d);
}

编译时没有错误提示。但是代码不接受字符串。
谁能帮我找出错误。

最佳答案

您的代码中有五个主要错误。

  1. scanf 不会“消耗”您按 ENTER 时生成的换行符,因此您需要 getchar 跟随它来处理这个问题意外行为。
  2. 您没有检查 malloc 的结果。此功能可能会失败。
  3. fgets 应该使用 n 来确定从用户那里获取的最大数据量,否则您会因缓冲区溢出而产生段错误。
  4. 包含 fgets 结果的字符串在典型情况下以换行符和 NULL 终止符结尾。您可以使用 strtok 将尾随换行符替换为 NULL 字符,以避免意外行为。
  5. 您没有释放您使用malloc 创建的内存。这会导致内存泄漏。

编辑:Matt McNabb 提供了一种替代方法来处理 FIX1 中未使用的 \n,我认为这是一种比我的方法更简洁的方法。

解决方案贴在下面。

代码 list


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void fun (char *);

int main() {
int n;
char *s = NULL;
printf("enter the length of the string\n");
scanf("%d",&n);
(void)getchar(); // FIX1

s = (char*)malloc(n * sizeof(char));
if (s == NULL) { // FIX2
printf("malloc error; aborting\n");
return 1;
}
printf("enter the string\n");
fgets(s, n, stdin); // FIX3
strtok(s, "\n"); // FIX4
printf("string before passing is %s\n",s);
fun(s);
free(s); // FIX5
return 0;
}

void fun(char *p) {
char *d;
d = p;

printf("string after passing is %s\n",d);
}

样本运行


enter the length of the string
10
enter the string
This is a test for overflows.
string before passing is This is a
string after passing is This is a

关于c - 使用 malloc 动态分配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25028761/

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