从stdin动态分配行?

时间:2015-04-06 04:56:16

标签: c arrays pointers dynamic

我正在尝试读取10行不同长度的文件(不超过349个字符),并将它们存储在动态分配的数组中,以便以后能够操作它们。我有下面的代码,它给了我一个“警告:传递参数1的âstrcpyâ使得指针来自整数而没有强制转换”的消息。

我在这里做错了什么?我的逻辑是地址应该是一个指针数组的指针,其中数组中的每个指针都指向字符串中的一行,我试图通过使用该行的strcpy来实现这一点。

    char buffer[350];
    char** addresses;
    int i = 0;

    *addresses = malloc(sizeof(char*)*10); /* Let's start off with 10 addresses  */

    while(fgets(buffer, sizeof(buffer), stdin) != NULL)
    {
            strcpy(*addresses[i],buffer);
            i++;
    }

4 个答案:

答案 0 :(得分:2)

你有几个问题:

  1. 语法:

    使用

    strcpy(addresses[i],buffer);
    

    而不是

    strcpy(*addresses[i],buffer);
    
  2. 内存:

    您需要为addresses[i]分配内存,然后才能将buffer的内容复制到其中。

    在调用addresses[i]之前添加一行以为strcpy分配内存。

    addresses[i] = malloc(sizeof(buffer));
    

答案 1 :(得分:1)

你必须这样付出,

strcpy(addresses[i],buffer);

如果你这样做,

strcpy(*addresses[i],buffer);

第一个参数将被视为单个字符。

在分配内存的同时,你可以这样做,

address=malloc(sizeof(char)*10);

您必须为每个指针分配内存。

address[i]=malloc(strlen(buffer)+1);

否则,您可以使用strdup函数来为给定的内存分配内存 字符串长度。

address[i]=strdup(buffer);
  

strdup()函数返回一个指向新字符串的指针,该字符串是字符串s的副本。记忆          对于新字符串是使用malloc(3)获得的,可以使用free(3)释放。

答案 2 :(得分:1)

addresses是指向指针的指针,因此您需要先为指针分配内存,然后再单独为每个指针分配内存,如下所示。

在2D空间中,如果addresses是指向指针的指针,则addresses[i]是指针。在写入此位置之前为其分配内存。

    char** addresses;

    addresses = malloc(sizeof(char*)*10);// Now you 10 character pointers
    int i = 0;
    while(fgets(buffer, sizeof(buffer), stdin) != NULL)
    {
        size_t n = strlen(buffer);
        if(n>0 && buffer[n-1] == '\n')
        buffer[n-1] = '\0';
        if(i>=10)
        break;
        addresses[i] = malloc(strlen(buffer)+1);//Allocate memory to the pointer before writing to it
        strcpy(addresses[i],buffer);
        i++;
    }

PS:fgets()附带一个换行符,所以我添加了一个检查来替换换行符。

答案 3 :(得分:1)

快速解决我在此处看到的错误:

  • 您取消引用addresses(例如*addressesaddresses[0]),而不确保addresses点在某处有效。在取消引用之前,您需要分配到addresses
  • *addresses[i]strcpy(*addresses[i],buffer)的类型为char,预计char *strcpy(addresses[i], buffer)。这是你的编译器抱怨的。我怀疑你的意思是malloc

即使您要在嵌入式环境中运行此代码,您的要求也很简单,您不需要malloc。事实上,引入#define nelem(array) (sizeof array / sizeof *array) /* number of elements in array */ int main(void) { char address[10][351] = { 0 }; size_t size = 0; while (size < nelem(address) && fgets(address + size, sizeof *address, stdin)) { address[size][strcspn(address[size], "\n")] = '\0'; size++; } } 使事情变得复杂......除非绝对必要,否则我会避免使用它。而是使用自动存储持续时间。它会让生活更轻松,因为你不会有太多的错误情况需要处理(尽管你还没有处理它们)...

10

请注意,351和{{1}}只会在此处显示一次...您可以在合理的范围内随意调整它们。如果您可以将它们乘以兆字节区域,您可能需要考虑不同的数据结构,具体取决于您打算如何处理。