[英]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.