【问题标题】:I don't know what's going wrong with this code?不知道这段代码有什么问题?
【发布时间】:2017-12-26 05:58:05
【问题描述】:

我正在编写一个简单的代码,它接受来自用户的任意长度的字符串并显示它。但是我的代码没有正确执行它,因为它接受了字符串但没有正确打印它。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
    int i,len;
    static int n=5;
    char a[20];
    char **s;
    s=malloc(5*sizeof(char));
    char *p;
    for(i=0;i<n;i++)
    {
        scanf("%s",a);
        if(*a=='1')                   /*to exit from loop*/
        {
            break;
        }
        len=strlen(a);
        p=malloc((len+1)*sizeof(char));
        strcpy(p,a);
        s[i]=p;
        if(i==n-1)
        {
            s=realloc(s,(5+i*5)*sizeof(char));
            n=5+i;
        }
    }
    for(i=0;i<n-1;i++)
    {
        printf("%s ",s[i]);
    }
    free(p);
    p=NULL;
    return 0;
}

【问题讨论】:

  • I am writing a simple code which accepts a string from the user of any length and just displays it....你在这里做了很多工作...
  • “我不知道这段代码出了什么问题?” - 仅仅一个问号不会把这句话变成一个问题。阅读this post about debugging
  • 你想accepts a string from the user of any length,但你只有一个19个字符的数组
  • fgetsscanf 更有利于您在此处所做的事情(通常在涉及用户输入的任何时候都是这种情况)
  • 无意义的问题标题减一分。

标签: c string pointers malloc


【解决方案1】:

有多个问题,但乍一看,最突出的是,

  s=malloc(5*sizeof(char));

错了。 s 的类型为 char **,因此您需要在那里分配价值为 char * 的内存。换句话说,您希望s 指向一个char * 元素,因此,您需要相应地分配内存。

为避免这些类错误,切勿依赖硬编码数据类型,而应使用表单

 s = malloc( 5 * sizeof *s);  // same as s=malloc( 5 * sizeof (*s))

其中,oid 的大小基本上由变量的类型决定。两大优势

  • 避免上述错误。
  • 代码变得更有弹性,您无需更改malloc()语句以防您选择更改数据类型

也就是说,scanf("%s",a); 也具有潜在的危险,并会因输入时间长于预期而导致缓冲区溢出。您应该始终使用最大字段宽度来限制输入扫描长度,例如

scanf("%19s",a);  // a is array of dimension 20, one for terminating null

也就是说,关于逻辑的建议,当您事先不知道或不指定输入字符串的长度时,您不能使用 string 类型来 scan 输入。完成这项工作的基本方法是

  1. 使用诸如malloc() 之类的分配器函数动态分配中等长度的缓冲区。
  2. 继续一一读取输入流,fgetc() 或类似的。
  3. 如果读取完成(例如,返回EOF),则您已读取完整的输入。
  4. 如果分配的内存已用完,请重新分配原始缓冲区并继续执行步骤 3。

还有,别忘了free() 内存。

否则,您可以使用fgets() 来读取内存块并如上所述保持重新分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多