只有字符串的第一个字符将以C打印

时间:2011-05-10 03:17:39

标签: c data-structures character-arrays

我有这个结构

typedef struct grade
{
    char firstName[SIZE];
    char lastName[SIZE];
    int stuNum;
}GRADE;

和此输出代码:

void printData(GRADE grade[], int used)
{
    int i;
    for(i=0; i<used-1; i++)
    {
        printf("%s %s %d\n", grade[i].firstName, grade[i].lastName, grade[i].stuNum);
    }
}

当我尝试打印字符时,他们只打印字符串的第一个字符,我处于静止状态,并且无法弄清楚如何打印字符串的其余部分。

此代码读取数据文件(格式为"Firstname Lastname StudentNumber"约17行,例如"Mark Markinson 1234" newline "blah blah 1234"等。

void readData(FILE *infile, GRADE grade[], int *count)
{
    char buf[SIZE] = {0};
    int position=*count;
    int used = 0;
    while( fgets(buf, SIZE, infile))
    { 
        removeNL(buf);

        grade[position].firstName[0] = parseName(buf, &used);
        used++;

        grade[position].lastName[0] = parseName(buf, &used);
        used++;

        grade[position].stuNum = parseNumber(buf, &used);
        used = 0;
        position++;
    }
    *count = position;

}

这是解析缓冲区名称的代码:

char parseName(char *str, int *place)
{
    char buf[SIZE] = {0}, name;
    int i=*place,j=0;

    while( str[i] != '\0' && !isspace(str[i]))
    {
        buf[j++] = str[i++];

    }
    buf[j] = '\0';

    *place = i;

    return *buf;
}

在这里提出一些建议之后我改变了一些代码,但它仍然做同样的事情(只打印第一个字符)

用这种方式调用函数

parseName(buf, &used, grade[position].firstName);

和parseName现在是

void parseName(char *str, int *place, char *firstName)
{
    char buf[SIZE] = {0}, name;
    int i=*place,j=0;    
    while( str[i] != '\0' && !isspace(str[i]))
    {
        buf[j++] = str[i++];

    }
    buf[j] = '\0';

    *place = i;

    *firstName = *buf;
}

3 个答案:

答案 0 :(得分:2)

return *buf返回(仅)buf中的第一个字符,这是您存储到firstNamelastName数组中的所有字符。问题是数组不是C中的第一类类型,因此您不能将它们作为参数传递给函数或将它们作为返回值返回。

您可能想要做的是将指针传递给缓冲区以填充parseName并将其填入而不是使用本地缓冲区。然后,您只需直接传递firstNamelastName,这将成为指向这些字段开头的指针。

答案 1 :(得分:1)

parseName中,您将所有输入放入缓冲区并返回第一个字符,然后将该字符分配给firstName[0]lastName[0],并且永远不会对其余部分执行任何操作您放入缓冲区的数据。难怪只打印一个角色。

你应该改变你的

grade[position].firstName[0] = parseName(buf, &used);

parseName(grade[position].firstName, &used);

没有任何理由在parseName中返回第一个字符。您可以将parseName的返回类型更改为char*并返回buf而不是*buf以获得一点冗余(某些C函数可以执行此操作)并且这样会更好设计。

答案 2 :(得分:1)

问题在于:

void readData(FILE *infile, GRADE grade[], int *count)
{
    char buf[SIZE] = {0};
    int position=*count;
    int used = 0;
    while( fgets(buf, SIZE, infile))
    { 
        removeNL(buf);

        grade[position].firstName[0] = parseName(buf, &used);
        used++;

        grade[position].lastName[0] = parseName(buf, &used);
        used++;

        grade[position].stuNum = parseNumber(buf, &used);
        used = 0;
        position++;
    }
    *count = position;

}

当你调用parseName时,你只需设置第一个字符。您应该将您的数组(您将在其中写入字符串)传递给parseName:

void readData(FILE *infile, GRADE grade[], int *count)
{
    char buf[SIZE] = {0};
    int position=*count;
    int used = 0;
    while( fgets(buf, SIZE, infile))
    { 
        removeNL(buf);

        parseName(buf, &used, grade[position].firstName);
        used++;

        parseName(buf, &used, grade[position].lastName);
        used++;

        grade[position].stuNum = parseNumber(buf, &used);
        used = 0;
        position++;
    }
    *count = position;

}

不要忘记更改parseName添加参数并将结果写入其中。