【问题标题】:i have written this code and but it's not working properly我已经写了这段代码,但它不能正常工作
【发布时间】:2018-06-02 06:18:34
【问题描述】:

我正在编写一个代码,它接受用户想要的长度字符串并显示它。所以这就是我写的

#include<stdio.h>
#include<stdlib.h>
void main()
{
  char *a;
  int i,n;
  a=(char*)calloc(1,sizeof(char));
  printf("enter the string\t");
  for(i=0;a[i]!=0;i++)
  {
        scanf("%[^0]c",&a[i]);
        n=2+i;
        a=(char*)realloc(a,(n)*sizeof(char));
  }
  for(i=0;a[i]!=0;i++)
  {
        printf("%c",a[i]);
  }
  free(a);
  a=NULL;
}

但它没有进入循环并接受任何输入。你能告诉我出了什么问题吗?谢谢

【问题讨论】:

  • 为什么要逐个字符地打印,而不是将其放入以 NULL 结尾的字符串缓冲区,然后直接将其提供给 printf?虽然free(a) 是可以理解的,但将a 设置为NULL 真的毫无意义。
  • 通常你会通过分配一个乐观的大缓冲区来解决这个问题,如果用户超过这个大小,重新分配两倍的大小。这避免了无情的重新分配。
  • scanf("%[^0]c",&amp;a[i]) 不是有效格式。我建议您使用 fgets 并以 100 字节的步长重新分配,然后重复直到在输入字符串的末尾检测到 '\n' 换行符。请注意,'\0' 不会终止输入字符串,而只会终止 C 字符串。
  • @WeatherVane scanf("%[^0]c",&amp;a[i]) 是一种有效的格式,但肯定不是 OP 想要的。

标签: c string dynamic-memory-allocation


【解决方案1】:

您没有进入循环,因为您将a 分配给calloc,因此a[0] 为0。它将使您的两个for 循环的初始a[i]!=0 测试失败。

【讨论】:

  • 但是 malloc() 也没有解决问题
  • 对于小长度的字符串,它可以正常工作,但随着长度的增长它会停止工作
  • 这是一个单独的问题。我解释了为什么你没有进入循环。如果您需要更多帮助,请编辑并更新您的问题。
猜你喜欢
  • 2021-04-10
  • 2023-01-19
  • 2013-06-23
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多