c程序多次接收最后一行

c程序多次接收最后一行,c,arrays,struct,malloc,C,Arrays,Struct,Malloc,我的程序的目的是通过io重定向接收用户输入,对其进行排序,并在没有重复记录的情况下输出。所有这些都使用指向动态分配的结构的指针数组。我的输出有点问题。它很可能会重复最后一行的多个结构。提前谢谢 函数文件 #include "lab67h.h" void getinput(address *temp[], int *s) { char c[25]; gets(c); while (c[0] != '\0' && *s < size)

我的程序的目的是通过io重定向接收用户输入,对其进行排序,并在没有重复记录的情况下输出。所有这些都使用指向动态分配的结构的指针数组。我的输出有点问题。它很可能会重复最后一行的多个结构。提前谢谢

函数文件

#include "lab67h.h"


void getinput(address *temp[], int *s)
{
    char c[25];

    gets(c);
    while (c[0] != '\0' && *s < size)
        {
        temp[*s] = (address *) malloc(sizeof(address));

        strcpy(temp[*s]->name, c);
        gets(c);
        strcpy(temp[*s]->street, c);
        gets(c);
        strcpy(temp[*s]->city, c); 
        gets(c);
        strcpy(temp[*s]->zipcode, c); 

        (*s)++;
        gets(c); 
        }
}
void sort(address *temp[], int s)
{
    address *tempi;

    for (int a = 0; a <= s; a++)
        {
        for (int b = 0; b < (s - 1); b++)
            {
            if (convert(temp, b) > convert(temp, b + 1))
                {
                tempi = temp[b];
                temp[b] = temp[b + 1];
                temp[b + 1] = tempi;
                }
            }
        }
}
int convert(address *tempp[], int c)
{
    int i = -1, num = 0;
    char str[10];
    strcpy(str, &tempp[c]->zipcode);
    while (str[++i] != '\0')
        num = num * 10 + (str[i] - '0');
    return num;
}
void output(address *temp[], int s)
{
    for (int i = 0; i < s; i++)
    {
        puts(temp[i]->name);
        puts(temp[i]->street);
        puts(temp[i]->city);
        puts(temp[i]->zipcode);

        while (temp[i]->name == temp[i + 1]->name && temp[i]->street == temp[i + 1]->street && temp[i]->city == temp[i + 1]->city && temp[i]->zipcode == temp[i + 1]->zipcode)
        {
            free(temp[i]);
            i++;
        }
        free(temp[i]);
        i++;

    }
}
头文件

#ifndef LAB67H_H_INCLUDED
#define LAB67H_H_INCLUDED
#define size 50
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

typedef struct
{
    char name[25];
    char street[25];
    char city[25];
    char zipcode[25];

} address;

void getinput(address*[], int*);
void sort(address*[], int);
int convert(address*[], int);
void output(address*[], int);

#endif
我得到的输出

Press any key to continue . . . 
K1, K2
720 Eucalyptus Ave 105 
Inglewood, CA
89030
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
G1, G2
20253 Lorenzana Dr
Los Angeles, CA
90005  
H1, H2
5241 Del Moreno Dr
Los Angeles, CA
91110
C1, C2
5142 Dumont Pl
Azusa, CA
91112
M1, M2
4819 Quedo Pl
Westlake Village, CA
913 62
D1, D2
20636 De Forest St
Woodland Hills, CA
91364
E1, E2
4851 Poe Ave
Woodland Hills, CA
91364
B1, B2
19831 Henshaw St
Culver City, CA
94023
I1, I2
5332 Felice Pl
Stevenson Ranch, CA
94135

您的代码循环,因为您不测试代码是否已达到EOF

有关为什么不应使用
get()
的讨论,请参阅

你需要的东西更像:

char c[25];

while (fgets(c, sizeof(c), stdin) != NULL && c[0] != '\0' && *s < size)
{
}
charc[25];
while(fgets(c,sizeof(c,stdin)!=NULL&&c[0]!='\0'&&s

您还需要在循环体中使用并测试,
fgets()
的结果
fgets()
检测到EOF或错误时返回NULL。(有关代码为什么不使用或需要使用feof()
)的讨论,请参见)。通过直接读取结构的元素,可以避免额外的复制操作。您需要决定如何删除
fgets()
保留而
gets()不保留的换行符。你也需要考虑如果一条线太长,该怎么办?通过在循环中调用函数可以更好地处理该问题。

您的输入代码将运行
size
多次,并使用上次读取的值(90001)填充剩余的结构。找到一种方法,在输入数据用完时停止while循环。

它没有显示所有行……我建议您还没有用尽调试选项。而在开始这样做之前,应该始终做到这一点。例如,在调用
sort
查看数据是否正常之前,您是否打印了数据?您是否尝试过使用较小的数据集,并使用调试器逐步执行?调试是一项值得学习和积累经验的宝贵技能,不应轻易外包给IT部门。有关为什么不应使用
get()
的讨论,请参阅。谢谢你们的回复。我意识到即使删除了重复项,它也不会显示所有的行。我试着使用较小的数据,是的,它似乎是有效的,但当我尝试你的第一个选项时,我得到了一个类似于我帖子中的输出。似乎错误在输入函数中。你建议我在这里做什么?使用小数据进行调试表明它是有效的。
Press any key to continue . . . 
K1, K2
720 Eucalyptus Ave 105 
Inglewood, CA
89030
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
90001
G1, G2
20253 Lorenzana Dr
Los Angeles, CA
90005  
H1, H2
5241 Del Moreno Dr
Los Angeles, CA
91110
C1, C2
5142 Dumont Pl
Azusa, CA
91112
M1, M2
4819 Quedo Pl
Westlake Village, CA
913 62
D1, D2
20636 De Forest St
Woodland Hills, CA
91364
E1, E2
4851 Poe Ave
Woodland Hills, CA
91364
B1, B2
19831 Henshaw St
Culver City, CA
94023
I1, I2
5332 Felice Pl
Stevenson Ranch, CA
94135
char c[25];

while (fgets(c, sizeof(c), stdin) != NULL && c[0] != '\0' && *s < size)
{
}