时间:2017-09-11 23:30:09

标签: c

我需要从stdin读取空格分隔的单词,然后使用emalloc函数为每个单词分配内存。

我发现这很令人困惑,这是我到目前为止所写的内容。

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

int main (void)
{
    #define SIZE 100
    char* username[100]; 
    int i;
    int p;

    /* Read words into array */
    for(i = 0; i < 100; i++)
    {
        username[i] = calloc(SIZE, sizeof(char)); 
        scanf("%s",username[i]);
    }

    /* Print out array */
    for (p = 0; p < 100; p++) {
        printf("%s", username[p]);
    }

    return 0;
}

我不确定我是否正确使用scanf读取单词,我很确定我的内存分配不太正确。来自Java,内存分配很难解决。为什么我不包括&amp;在scanf函数中面向用户名[i]?

1 个答案:

答案 0 :(得分:1)

您的代码很好,只有几个问题:

  
      
  1. 你应该释放指针数组指向的内存。

  2.   
  3. 使用scanf()很危险,因为可能会发生缓冲区溢出。

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

int main (void)
{
    #define SIZE 100
    char* username[100]; 
    char *nl;

    int i;
    int p;

    /* Read words into array */
    for(i = 0; i < 3; i++)
    {
        username[i] = calloc(SIZE, sizeof(char)); 
        printf("Enter word %d:", i+1);
        fgets( username[i], SIZE, stdin );
        // Remove newline
        if ((nl = strchr(username[i], '\n')))
        {
            *nl = '\0';
        }
    }

    /* Print out array */
    for (p = 0; p < 3; p++) {
        printf("[%s]\n", username[p]);
        free( username[p] );
    }

    return 0;
}

输出:

~/src/svn/misc > ./a.out 
Enter word 1:One
Enter word 2:Two
Enter word 3:Three
One
Two
Three