所以我做了一個專案,我試著和朋友一樣做,但由于某種原因,我不斷收到錯誤:賦值給陣列型別的運算式,idk 如何避免。
所以我有一個名為 Aeroporto 的結構和一個由 Aeroportos 組成的串列 lista_A。我要求用戶定義每個 Aeroporto 內部的內容,如果他提供的輸入沒有問題,那么它將把 Aeroporto 保存在串列 list_A 中,但它不起作用。
我一整天都沒有進步,我真的可以用一條出路
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define LEN_ID 3
#define LEN_P 30
#define LEN_CIDADE 50
#define AT 40
#define STR(x) #x
#define XSTR(x) STR(x)
typedef struct aeroporto
{
char id[LEN_ID 1];
char pais[LEN_P 1];
char cidade[LEN_CIDADE 1];
} Aeroporto;
int soMaiusculas(char s[])
{
int i = 0, len = strlen(s);
for (;i<len;i )
{
if (s[i]< 'A' || s[i]>'Z')
return 0;
}
return 1;
}
int main()
{
char input, p_id[LEN_ID ], p_pais[LEN_P ], p_cidade[LEN_CIDADE ], c;
int i = 0;
Aeroporto lista_a[AT];
scanf("%c",&input);
while (input != 'q'){
if (input == 'a')
{
scanf("%" XSTR(LEN_ID) "s",p_id);
scanf("%" XSTR(LEN_P) "s",p_pais);
scanf("%" XSTR(LEN_CIDADE) "[^\n]", p_cidade);
scanf("%*c");
printf("airport %s, %s, %s\n",p_id, p_pais, p_cidade);
if (!soMaiusculas(p_id))
printf("invalid airport ID\n");
else if (i==AT)
printf("too many airports\n");
/*else if (existeAero(lista_a, id))*/
else{
lista_a[i].id = p_id; //Now this is where the error is happening but following my //friend's advice it should work no?
lista_a[i].pais = p_pais;
lista_a[i].cidade = p_cidade;
i ;
}
}
scanf("%c",&input);
}
return 0;```
uj5u.com熱心網友回復:
重申評論:
不幸的是,您的朋友在這里不正確。您不能將一個陣列直接分配給另一個陣列。您必須一個一個地復制每個元素。
對于字串,標準庫提供了strcpy為我們執行此操作的函式。
對于一般用例,memcpy并且memmove存在。
所以
lista_a[i].id = p_id;
lista_a[i].pais = p_pais;
lista_a[i].cidade = p_cidade;
應該
strcpy(lista_a[i].id, p_id);
strcpy(lista_a[i].pais, p_pais);
strcpy(lista_a[i].cidade, p_cidade);
此外,您的臨時緩沖區應該大一個位元組:
char input, p_id[LEN_ID 1], p_pais[LEN_P 1], p_cidade[LEN_CIDADE 1];
順便說一句,您的決議方案可能會出錯。
函式族的回傳值*scanf回傳發生的成功轉換的次數,并且應該始終在決議失敗的情況下進行測驗,或者檢查錯誤。
欄位寬度說明符 ( Bs) 是允許讀取的最大字符數。最小值始終為1。所有機場代碼的長度正好是 3 個字符。
此外,您的字串輸入可能會相互滲透:
- 如果
ABCDEF作為機場 ID 提交,DEF則會將第一個字符讀入國家緩沖區。國家和城市緩沖區的情況類似。 - 如果為城市提交的字串超過 50 個字符,則第 52 個字符將滲入您的控制陳述句中。
scanf從不良輸入中恢復的方式很少。
考慮使用基于行的方法,使用類似fgetsor的函式getline并使用sscanf.
uj5u.com熱心網友回復:
這是產生錯誤的陳述句:
lista_a[i].id = p_id;
該陳述句將指標 ( p_id) 分配給陣列 ( lista_a[i].id)。這不是一個有效的分配,因為指標不能分配給 char 陣列,此外,指標通常占用陣列中的 3 個位元組以上。我猜你真的想將 into的內容復制p_id到該id欄位中。由于兩個陣列的長度相同(LEN_ID),這將是進行復制的好方法:
strncpy(lista_a[i].id, p_id, LEN_ID-1);
我建議strncpy而不是strcpy因為它更安全——如果 p_id 字串由于某種原因不包含零終止符,strncpy將拒絕寫入超出目的地的末尾。(但是,它也不會零終止,因此如果您也想避免這種情況,則需要格外小心。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/448228.html
標籤:C
