簡體   English   中英

比較2個字符串,一個在結構中,而不是C編程

[英]Comparing 2 Strings, one in a struct other not C programming

我有這個數據庫,我需要檢查產品名稱是否已經在數據庫中,否則我要求用戶輸入另一個。

問題是這樣的:

我正在嘗試將結構中找到的字符串(產品名稱)與用戶輸入的字符串進行比較。

結構編碼,用戶輸入部分和搜索方法如下:

產品結構

typedef struct
{
    char    pName[100];
    char    pDescription [100];
    float   pPrice;
    int     pStock;
    int     pOrder;
}product;

checkProduct方法:

int checkProduct (char nameCheck[100])
{
    product temp;
    p.pName = nameCheck;

    rewind (pfp);
    while (fread(&temp,STRUCTSIZE,1,pfp)==1)
    {
        if (strcmp (temp.pName,p.pName))
        {
            return 1;
        }
    }
    return 0;
}

和用戶輸入部分[部分代碼]:

char nameCheck[100];
gets (nameCheck);
checkProduct (nameCheck);
while (checkProduct == 1)
{
    printf ("Product Already Exists!\n Enter another!\n");
    while (getchar() !='\n')
    {
        continue;
    }
}
p.pName = nameCheck;

現在我遇到以下錯誤(我使用ECLIPSE):

在行上(checkProduct == 1)[找到用戶輸入]給我:“指針和整數之間的比較 - 默認啟用”由黃色警告三角標記

p.pName = nameCheck; 標記為紅十字並停止我的編譯說:“從類型'char *'中分配類型'char [100]時不兼容的類型^ ----在用戶輸入和我比較字符串時給我帶來麻煩。

任何建議我如何解決它或者我可以如何尊重它? 我無法理解為什么在結構中char pName被標記為'*'而在char [100]中它不是。

有什么簡短的解釋嗎?

先感謝您

編輯:用下面的一些代碼修改代碼后:這是產品的輸入名稱部分;

char *nameCheck;
        nameCheck = "";
        fgets(nameCheck,sizeof nameCheck, stdin);

        checkProduct (nameCheck);

        int value = checkProduct (nameCheck);
        while (value == 1)
        {
            printf ("Product Already Exists!\n Enter another!\n");
            while (getchar() !='\n')
            {

            }
        }
        strcpy (p.pName, nameCheck);

這是新的checkName方法

int checkProduct (char *nameCheck)
{
    product temp;
    strcpy (p.pName, nameCheck);

    rewind (pfp);
    while (fread(&temp,STRUCTSIZE,1,pfp)==1)
    {
        if (strcmp (temp.pName,p.pName) == 0)
        {
            return 1;
        }
    }
    return 0;
}
p.pName = nameCheck; 

當您嘗試將一個數組的地址分配給另一個數組時,這是錯誤的。 你可能想要的是復制它。

請改用strcpy()

strcpy(p.pName, nameCheck);

while (checkProduct == 1)

由於checkProduct是一個函數,因此上述條件將始終為false,因為函數的地址不等於1.您可以將返回值存儲在另一個整數中,如下所示:

int value = checkProduct(nameCheck);
while (value == 1)
/* rest of the code */

或者更簡單地說:

while ( checkProduct(nameCheck) == 1 ) {
...

注意 - 我沒有檢查整個代碼,除此之外可能還有其他錯誤。 順便說一句,如果你是編程新手,你可以從教科書中的小例子開始,然后努力解決一些復雜的問題。

int checkProduct (char nameCheck[100])

請注意,類型簽名是謊言。 簽名應該是

int checkProduct(char *nameCheck)

因為函數期望和接收的參數是一個指向char的指針,或者為用戶記錄該參數應該是一個指向0終止的char數組的第一個元素的指針

int checkProduct(char nameCheck[])

數組永遠不會作為參數傳遞給函數,作為函數參數,並且在大多數情況下[例外,當數組是sizeof的操作數時, _Alignof或地址運算符& ]被轉換為指向第一個元素的指針。

    {
        product temp;
        p.pName = nameCheck;

數組不可分配。 只有在=的左邊有一個數組名稱才能在聲明數組的位置進行初始化。

你可能想要

strcpy(p.pName, nameCheck);

那里。

        rewind (pfp);
        while (fread(&temp,STRUCTSIZE,1,pfp)==1)
        {
            if (strcmp (temp.pName,p.pName))

如果第一個參數按字典順序小於第二個參數,則strcmp返回負值;如果兩個參數相等,則返回0;如果第一個參數按字典順序大於第二個參數,則返回正值。

你可能想要

if (strcmp(temp.pName, p.pName) == 0)

那里。

    gets (nameCheck);

切勿使用gets 這是非常不安全的(並且已經從上一個標准中的語言中刪除了,yay)。 采用

fgets(nameCheck, sizeof nameCheck, stdin);

但如果有足夠的空間,則將換行符存儲在緩沖區中,因此如果存在,則必須用0覆蓋它。

如果您使用POSIX系統並且不需要關心可移植性,則可以使用getline()讀取一行而不存儲尾隨換行符。

    checkProduct (nameCheck);

您檢查產品是否已知,但丟棄結果。 將其存儲在變量中。

    while (checkProduct == 1)

checkProduct是一個函數。 在幾乎所有情況下,函數指示符都轉換為指針,因此警告指針和整數之間的比較。 您打算與上面應存儲的呼叫值進行比較。

    {
        printf ("Product Already Exists!\n Enter another!\n");
        while (getchar() !='\n')

您在不存儲字符的情況下讀取字符。 所以你永遠不會改變nameCheck的內容,然后陷入無限循環。

        {
            continue;
        }

如果循環體中唯一的語句是continue; ,你應該把身體留空。

    }
    p.pName = nameCheck;

再一次,您無法分配給數組。


關於編輯,

char *nameCheck;
nameCheck = "";
fgets(nameCheck,sizeof nameCheck, stdin);

您已將nameCheck從數組更改為指針。 這意味着sizeof nameCheck現在不會給出你可以存儲在數組中的char的數量,但是指向char的指針的大小,它與它所指向的無關(通常在32位系統上為4,在8位上為64位系統)。

然后你讓那個指針指向一個字符串文字"" ,這就是崩潰的原因。 嘗試修改字符串文字是未定義的行為,並且通常會導致崩潰,因為字符串文字通常存儲在內存的只讀段中。

你應該把它留在

char nameCheck[100];
fgets(nameCheck, sizeof nameCheck, stdin);

然后你可以使用sizeof nameCheck告訴fgets它可以讀取多少個字符,或者,你可以有一個指針和malloc一些內存,

#define NAME_LENGTH 100
char *nameCheck = malloc(NAME_LENGTH);
if (nameCheck == NULL) {
    // malloc failed, handle it if possible, or
    exit(EXIT_FAILURE);
}
fgets(nameCheck, NAME_LENGTH, stdin);

無論哪種方式,在獲得輸入后,刪除換行符,如果有的話:

size_t len = strlen(nameCheck);
if (len > 0 && nameCheck[len-1] == '\n') {
    nameCheck[len-1] = 0;
}
// Does windows also add a '\r' when reading from stdin?
if (len > 1 && nameCheck[len-2] == '\r') {
    nameCheck[len-2] = 0;
}

暫無
暫無

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

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