簡體   English   中英

將字符串與 C 中的結構成員進行比較

[英]Comparing a string with a struct member in C

我正在嘗試創建一個小票定價系統。 用戶輸入陪同他們到主題公園的人作為命令行參數(高級/成人/兒童/學生),包括他們自己(根據該列表他們是什么),我將命令行 arguments 與名為 tier 的結構成員進行比較 -這部分將在稍后完成,並提供檢查每一個的指針,但在那之前,我只是試圖讓這個較小版本的已完成程序工作,但似乎無法工作。 它不允許我將結構成員(字符串)與命令行參數進行比較。 我發現糾正這個有點令人困惑,因為錯誤消息

strcmpare.c:17:29: error: use of undeclared identifier 'senior' if (strcmp(argv[a], senior.tier[a]) == 0)

沒有提供任何關於我應該做什么的線索。 這是到目前為止的代碼(我使用的是 cs50 課程和沙箱,因此是 cs50.h header 文件。提前道歉,我不確定 C 中的等價物是什么):

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

struct ages
{
    char tier[7];
    int price;
};

void structorganizer(struct ages senior, struct ages adult, struct ages child, struct ages student);

int main(int argc, string argv[])
{
    for (int a = 0; a <= (argc-1); a ++)
    {
        if (strcmp(argv[a], senior.tier[a]) == 0)
        {
            printf("no errors");
            return 0;
        }
        printf("scrutinise more");
        return 1;
    }
}

void structorganizer(struct ages senior, struct ages adult, struct ages child, struct ages student)
{
    strcpy(senior.tier, "Senior");
    senior.price = 10;

    strcpy(adult.tier, "Adult");
    adult.price = 30;

    strcpy(child.tier, "Child");
    child.price = 0;

    strcpy (student.tier, "Student");
    student.price = 20;
}

首先,我認為您應該將結構的聲明更改為:(我想以大寫開頭的結構名稱是一個很好的約定)

typedef struct{
    char tier[7];
    int price;
}Age;

然后在主體中,您必須創建一個新實例,例如:

int main(int argc, string argv[])
{
    Age senior;//HERE
    for (int a = 0; a <= (argc-1); a ++)
    {
        if (strcmp(argv[a], senior.tier[a]) == 0)
        {
            printf("no errors");
            return 0;
        }
        printf("scrutinise more");
        return 1;
    }
}

如果這樣做,還要更改結構組織器 function 中的結構名稱,如下所示

void structorganizer(Age senior, Age adult, Age child, Age student)

我發現糾正這個有點令人困惑,因為錯誤消息沒有提供任何關於我應該做什么的線索。

相反,它實際上告訴你該做什么。 錯誤消息並非總是如此,但在這里。 變量senior沒有聲明,所以需要聲明。

那么你應該在哪里做。 您似乎想使用structorganizer來初始化事物。 通常,全局變量是您想要避免的事情,當然有更好的方法來解決這個問題,但只是為了快速讓事情正常工作。 從 function 中刪除所有 arguments 並在之前聲明全局變量,然后在main中首先調用structorganizer ,如下所示:

struct ages
{
    char tier[8]; // Changed to 8 because you need one more than the string length
    int price;
};

// Evil global variables, just to make code work with as little
// changes as possible
struct ages senior, adult, ages, child, student;

void structorganizer(); // Init the evil globals

int main(int argc, string argv[])
{
    structorganizer();

    // Continue as before

這應該足以讓代碼正常工作,但您顯然需要在這里花更多時間了解基礎知識。 你現在寫的代碼對你來說太高級了。 嘗試並不羞恥:)

在某些情況下,使用初始化程序 function 是很好的,但我不能說這是其中之一。 我會像這樣在main中聲明它們:

int main(int argc, string argv[])
{
    struct ages senior   = { .tier = "Senior",   .price=10 };
    struct ages adult    = { .tier = "Adult",    .price=30 };
    struct ages child    = { .tier = "Child",    .price=0  };
    struct ages student  = { .tier = "Student",  .price=20 };
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM