【问题标题】:comparison between pointer and integer error指针和整数错误的比较
【发布时间】:2011-04-22 03:40:05
【问题描述】:

大家好,我有这个 c 程序正在运行,我想修改 printbooking() 以便只打印状态为“已签出”的房间 到目前为止,我只收到关于指针和整数之间比较的错误......关于我应该如何做到这一点的任何帮助? 并且。我希望能够使用 roomID 搜索房间并编辑他们的详细信息。任何帮助将不胜感激! 这是我的代码

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

typedef struct{
char BookId[7];
char CustId[7];
char RoomId[5];
char NumGuests[4];
char StartDate[11];
char EndDate[11];
char Status[20];
} booking_t;

int readBooking(booking_t *myStruct)
{
FILE *infile;
infile = fopen("booking.txt", "r");
char record[201];
char *token;
int i = 0;
while (fgets(record, 200, infile) != NULL) {
    token = strtok(record, ";");
    strcpy(myStruct[i].BookId, token);
    token = strtok(NULL, ";");
    strcpy(myStruct[i].CustId, token);
    token = strtok(NULL, ";");
    strcpy(myStruct[i].RoomId, token);
    token = strtok(NULL, ";");
    strcpy(myStruct[i].NumGuests, token);
    token = strtok(NULL, ";");
    strcpy(myStruct[i].StartDate, token);
    token = strtok(NULL, ";");
    strcpy(myStruct[i].EndDate, token);
    token = strtok(NULL, "\n");
    strcpy(myStruct[i].Status, token);
    i++;
}
fclose(infile);
return(i);
}

//这是我只想打印出“已签出房间”的代码

void printBooking(booking_t *myStruct, int Size)
{
    printf("Booking ID, Customer ID, Room ID, Number of Guests, Start Date, End Date, Status\n");
int i;
for(i = 0; i < Size;i++){
    if(myStruct[i].Status[15] == "checked-out") //the error message points to this line
printf("%s %s %s %s %s %s %s\n", myStruct[i].BookId, myStruct[i].CustId, myStruct[i].RoomId, myStruct[i].NumGuests, myStruct[i].StartDate, myStruct[i].EndDate, myStruct[i].Status); 
}
printf("\n");
}

//

void printMayBooking(booking_t *myStruct, int Size)
{
    printf("Booking ID, Customer ID, Room ID, Number of Guests, Start Date, End Date, Status\n");
int i;
for(i = 0; i < Size;i++){
    if(myStruct[i].StartDate[4] == '5')
        printf("%s %s %s %s %s %s %s\n", myStruct[i].BookId, myStruct[i].CustId, myStruct[i].RoomId, myStruct[i].NumGuests, myStruct[i].StartDate, myStruct[i].EndDate, myStruct[i].Status); 
}
printf("\n");       
}

int main()
{
    booking_t booking_list[50];
    int Size;
    Size = readBooking(booking_list);
    printBooking(booking_list, Size);
    printMayBooking(booking_list, Size);
    return(0);
}

【问题讨论】:

    标签: c arrays file-io char


    【解决方案1】:
    if(myStruct[i].Status[15] == "checked-out")
    

    myStruct[i].Status[15] 给出了该索引处的字符,您正在将其与问题所在的字符串进行比较。

    我认为您需要使用strcmpStatus 数组本身进行比较。

    if( strcmp( myStruct[i].Status, "checked-out") == 0 )
    // ...
    

    【讨论】:

    • if(strcmp(myStruct[i].Status, "checked-out") == 0) 这给了我一个分段错误:(
    • 检查 myStruct 是否为 NULL 以表示分段错误。
    【解决方案2】:

    Status[15] 是一个char,您正试图与const char *“签出”进行比较。我不知道“15”是什么意思,但我怀疑你只是想要

    if(strcmp(myStruct[i].Status, "checked-out") == 0) 
    

    strcmp()是C语言中的字符串比较函数。

    【讨论】:

    • [15] 出现错误(我猜我必须输入它,因为它是一个字符)
    • -1 您的第一句话在金钱上是对的,所以我不完全理解您为什么在代码建议中犯了与 OP 相同的错误。
    • 我使用了你的代码段,结果出现了段错误,有什么线索吗?
    • 您确定Size 小于 50,并且您读取的所有字符串都小于您为它们分配的大小(包括每个字符串末尾的零字节字符串?”你的“readBooking”函数充满了危险——根本没有错误检查,而且有一百万个可能出错的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多