0

我正在使用结构类型。我从我自己的文件中提取了一行,上面写着“地狱犬守卫冥河”。当我尝试打印出来时,只打印出字母“c”。我不知道为什么会这样。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned int uint;

struct wordType
{
    char word[80];
    uint count;
};

struct wordType words[10];

int main( void ) {
    FILE * inputFile;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;
    uint index;
    inputFile = fopen( "input.txt", "r");

    if( inputFile == NULL )
    {
        printf( "Error: File could not be opened" );
        /*report failure*/
        return 1;
    }   

    index = 0;
    while( ( read = getline( &line, &len, inputFile ) ) != -1 )
    {
        printf( "%s\n", line );
        *words[index].word = *line;
        printf("line = %s\n", (words[index].word) );
    }

    free( line );
    return 0; 
}   
4

2 回答 2

2
*words[index].word = *line;

复制line[0]words[index].word[0],所以这只是一个字符。如果要复制整行,则必须使用

strcpy(words[index].word, line);

但是你应该验证这条线是否合适,即

strlen(line) < 80

在那之前。

于 2013-04-28T20:23:56.047 回答
0

好的,这是您如何分配线对象的内存的问题。根据您的代码,您设置了一个 char*,但是您从不为其分配任何内存。话虽如此,您的 char* 将只能容纳 1 个字符,或者更准确地说是在您使用的任何系统中填充标准 char 的字符数。

要解决此问题,您需要在代码中调用 malloc() 以将字符串的长度分配给 char*。

line = (char *)malloc(SizeofString);

此代码将为您的线对象提供正确的大小以容纳整个字符串,而不仅仅是一个字符。但是,您可能希望使用以下作为字符串大小以确保平台独立性。

SizeofString = sizeof(char) * numberofCharactersinString;

然后使用 strcpy() 复制该行的内容。

编辑:: 由于 GetLine() 调用函数的方式,我上面写的内容似乎具有误导性。malloc() 会为您调用哪个。

于 2013-04-28T20:31:38.637 回答