C 从输入文件动态分配

C 从输入文件动态分配,c,malloc,strcpy,C,Malloc,Strcpy,考虑以下几点: typedef struct wordType { char word; uint count; }; int main( void ) { typedef struct wordType * WORD_RECORD; WORD_RECORD arrayOfWords = malloc(10 * sizeof( WORD_RECORD) ); FILE * inputFile; char temp[50]; uint

考虑以下几点:

typedef struct wordType
{
    char word;
    uint count;
};

int main( void ) 
{
    typedef struct wordType * WORD_RECORD;
    WORD_RECORD arrayOfWords = malloc(10 * sizeof( WORD_RECORD) );

    FILE * inputFile;
    char temp[50];
    uint index;
    inputFile = fopen( "input.txt", "r"); 

    while( fscanf( inputFile, "%s", temp) == 1 )
        {
        printf("%s\n", temp );
        arrayOfWords[index].word = malloc( sizeof(char)*(strlen(temp) + 1 ));

        strcpy( arrayOfWords[index].word, temp );
    }
    index++;
}
每次通过scanf接收到一个单词时,我都会尝试malloc。然而,我似乎无法理解为什么这不起作用。我发现了一些错误:

warning: assignment makes integer from pointer without a cast

warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast

c字符串的类型为char*。当你说

char word;
你只为一个角色创造了足够的空间,而不是整个角色。使单词类型为char*:

char* word;
别忘了数一数


此外,您可能需要注意的是,您从未读取超过10行的数据,否则会出现另一个内存错误。

c字符串的类型为char*。当你说

char word;
你只为一个角色创造了足够的空间,而不是整个角色。使单词类型为char*:

char* word;
别忘了数一数


此外,您可能需要注意的是,您从未读过超过10行的内容,否则会出现另一个内存错误。

您希望将
word
用作字符串。字符串是以null结尾的字符数组,因此需要为其指定类型
char*
。由于要为每个单词动态分配内存,请确保稍后对每个单词调用
free

或者,您可以利用
temp
是一个50字符的数组和硬编码
word
的事实来获得类似的大小


最后一个次要点,
sizeof(char)
保证为1,这样您可以简化
malloc
计算。

您想将
word
用作字符串。字符串是以null结尾的字符数组,因此需要为其指定类型
char*
。由于要为每个单词动态分配内存,请确保稍后对每个单词调用
free

或者,您可以利用
temp
是一个50字符的数组和硬编码
word
的事实来获得类似的大小


最后一个小点,
sizeof(char)
保证为1,这样你可以简化你的
malloc
计算。

什么是
arrayOfWords[index]的类型。word
?我编辑了上面的代码,这样你就可以看到。
arrayOfWords[index]的类型是什么。word
?我编辑了上面的代码,这样你就可以看到。这是我的错,我编辑了代码。我希望它应该是一个结构数组,这是我做的。现在,当我设置一个循环来遍历结构数组并打印出单词时,我遇到了一个切分错误。这是由于我试图将单词复制到数组中的方式造成的吗?strncpy将是strcpy的更安全的替代方法,尤其是在您怀疑有错误的情况下。不,
strncpy
可能会导致无法复制nul终止符@SeanHellebusch您发布的代码中唯一的错误是
word
的类型。如果您修复了这个问题,但仍然存在问题,那么将更新后的代码作为一个新问题发布可能是值得的。如果我在输入中阅读了我不控制的内容,那么尽可能地将其屏蔽是有意义的,因此使用了sprintf,并添加了您提到的null。您还需要确保fscanf永远不会获得超过50个字符的行。那是我的错,我编辑了代码。我希望它应该是一个结构数组,这是我做的。现在,当我设置一个循环来遍历结构数组并打印出单词时,我遇到了一个切分错误。这是由于我试图将单词复制到数组中的方式造成的吗?strncpy将是strcpy的更安全的替代方法,尤其是在您怀疑有错误的情况下。不,
strncpy
可能会导致无法复制nul终止符@SeanHellebusch您发布的代码中唯一的错误是
word
的类型。如果您修复了这个问题,但仍然存在问题,那么将更新后的代码作为一个新问题发布可能是值得的。如果我在输入中阅读了我不控制的内容,那么尽可能地将其屏蔽是有意义的,因此使用了sprintf,并添加了您提到的null。您还需要确保fscanf永远不会获得超过50个字符的行。