为什么我一直收到“警告:指针和整数错误之间的比较”?

时间:2014-05-25 20:33:45

标签: c

有谁知道为什么我的程序没有从我的分隔文件中读取?我认为在程序通过底部的printPropertyListing()方法运行之后会打印出分隔文件中的所有内容,但它会向我显示警告"warning: comparison between pointer and integer"的错误消息。它告诉我错误是在main方法的for循环的起始行。有什么解决方案吗?

以下是我的分隔文件:


123 Cherry Tree Drive#330#Condo#2#1#275900#Toronto#
14 Leaside Lane#N/A#House#4#2#445500#Brampton#
2478 Waterfront Avenue#N/A#House#5#3#899900#Mississauga#
7 Lucky Lane#1206#Condo#3#2#310000#Toronto#
51 West Street#32#Townhouse#4#2#450000#Brampton#
193 Crystal Road#1519#Condo#1#1#250750#Toronto#
3914 Tangerine Terrace#N/A#House#3#1#427750#Mississauga#
10 Redding Road#N/A#House#4#2#512350#Toronto#
76 Old School Avenue#227#Townhouse#3#2#475000#Toronto#
90 Brookhaven Terrace#N/A#House#4#2#512750#Brampton#

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

typedef struct {
    char buildingType[10];
    int numBedrooms;
    int numBathrooms;
    }Propertylisting;

typedef struct {

Propertylisting propertylisting;
    char address[100];
    char unitNum [10];
    char city [50];
    int listPrice;
} Listing;

void parseListings(FILE *in, Listing listing[], int arraySize); 
void printPropertyListing(Listing l);


int main()
{
    Listing listing[10];
    FILE *fp = fopen("PropertyListings.txt", "r");

    if (fp == NULL) 
    {
        printf("Could not open file!");
        exit(1);
    } 
    else 
    {
        parseListings(fp, listing, 10);

        if (listing == 0) 
        {
            printf("No Property data found.");
            exit(1);
        }

        printf("\nNumber of listings in file: %d\n\n", listing);
        int i;
        for (i = 0; i < listing; i++) 
        {
            printPropertyListing(listing[i]);
            printf("\n");
        }
        fclose(fp);

    }
    return 0;
}

void parseListings(FILE *in, Listing listing[], int arraySize)
{
    // Holds the current index of the Listing array
    int n = 0;

    // Set value as empty string
    char line[256];

    // A token pointer that the strtok() function returns
    char *token;

    char *delimiter = "#";

    while (!feof(in)&& n > arraySize) 
    {
        fgets(line, 256, in);

        // Read the address
        token = strtok(line, delimiter);
        strcpy(listing[n].address, token);

        // Read the unitNum
        token = strtok(NULL, delimiter);
        strcpy(listing[n].unitNum, token);

        // Read the building typede
        token = strtok(NULL, delimiter);
        strcpy(listing[n].propertylisting.buildingType, token);

        token = strtok(NULL, delimiter);
        int numBedrooms = strtol(token, NULL, 10);
        listing[n].propertylisting.numBedrooms = numBedrooms;

        token = strtok(NULL, delimiter);
        int numBathrooms = strtol(token, NULL, 10);
        listing[n].propertylisting.numBathrooms = numBathrooms;

        token = strtok(NULL, delimiter);
        int listPrice = strtol(token, NULL, 10);
        listing[n].listPrice = listPrice;

        token = strtok(NULL, delimiter);
        strcpy(listing[n].city, token);
        n++;
    }

    return n;
}

void printPropertyListing(Listing l) 
{
    printf("%s %s %s\n%s %d %d %d\n\n", 
        l.address, 
        l.unitNum, 
        l.city, 
        l.propertylisting.buildingType, 
        l.propertylisting.numBedrooms, 
        l.propertylisting.numBathrooms, 
        l.listPrice);
}

2 个答案:

答案 0 :(得分:2)

问题出在你的for循环中:

for (i = 0; i < listing; i++)

的类型为int,而列表的类型为Listing [10];

答案 1 :(得分:1)

正如其他人所指出的,你的listing变量是一个数组(实际上是一个指向用作数组的内存块开头的指针)。这意味着您正在尝试将指针与int进行比较,这是没有意义的。

看起来您正在尝试与数组的大小进行比较,并且由于您的parseListings函数已经返回了已解析的列表数,因此您可以执行以下操作:

    int numListings = parseListings(fp, listing, 10);

    if (numListings == 0) {
        printf("No Property data found.");
        exit(1);
    }

    printf("\nNumber of listings in file: %d\n\n", numListings);
    int i;
    for (i = 0; i < numListings; i++) {
        printPropertyListing(listing[i]);
        printf("\n");
    }

您会注意到我更改了您使用listing变量的其他几个位置,但我怀疑您想要检查列表的数量。

除此之外,Jens还有一些关于程序中其他错误的观点,这将使其成为了解while 1: ... break;范例的最佳时机。

while (n < arraySize) {
    fgets(line, 256, in);

    if(feof(in)) {
        break;
    }

指出其他人指出所有这些错误;我刚刚尝试将他们的所有回复制定为一个连贯的指南,指出你应该考虑的事项,以便具体改进这些代码以及所有代码。

编辑:另外,应该将parseListing的返回类型更改为int,以匹配您return n;

的事实