C語言中結構體中的陣列,不能直接賦值嗎

時間 2022-01-26 07:19:46

1樓:天方夜譚的哆啦a夢

intmain(void);

printf("%d,%s\n",bao.id,bao.name);//輸出是4224528,空(應該是null)

//structstudentsbao=;可以。第一種賦值方法

//strcpy(bao.name,"bao");//可以,

//printf("%d,%s\n",bao.id,bao.name);

//bao.name="bao";錯誤「stray'\351'inprogram」其他是亂碼,

//bao.name[0]='a';

//bao.name[0]='/0';

//printf("%d,%s\n",bao.id,bao.name);

/*這樣可以,*/

//chararr[10]="baobao";

////bao.name=arr;//error"assignmenttoexpressionwitharraytype"

//scanf("%s",bao.name);//可以,

//printf("%d,%s\n",bao.id,bao.name);

//所以scanf那一類函式都可以。

//還有就是memcpy函式也是可以的

return0;

擴充套件資料

c語言結構體陣列的直接賦值及陣列的長度計算:

#include

//自定義乙個字串的結構體,包含字串和字串長度兩個變數

typedefstructstrmystr;

//剛開始宣告變數時每個變數的字串長度length都為0

//這裡以長度為10的陣列為例,陣列長度是1000

//對第0個到第9個結構體陣列的長度同時賦值為0

mystrmystr1[10]={

[0...9]={

.length=0,

intmain(){

inti;

for(i=0;i<10;i++){

printf("%d\n",mystr1[i].length);

return0;

2樓:學荷紫詩好

t2.mark=t1.mark;//mark為結構體中的陣列,不能直接賦值??

是的,陣列名是個靜態位址值,不能被修改,如果想把資料儲存到其中,可以用memcpy()函式進行記憶體拷貝,或採用迴圈進行賦值

#include

memcpy(

t2.mark,

t1.mark,

sizeof(t2.mark));

3樓:僕聽雲龐淼

對於已經定義好了的陣列,肯定不能用這樣賦值啦,給結構體賦值其實就跟其他的變數賦值一樣,難道你可以

inta[3];

a=;這個給乙個int陣列賦值嗎,不行啊。

正確的做法就是像其他變數一樣乙個乙個賦值,當然也可在結構體初始化時賦值

c語言中結構體,可以在定義結構體型別的時候,給某些成員賦值不

4樓:兜裡有兩塊糖

在c語言的語法中,這樣不行

如果你需要初始化

可以這樣寫

struct stu student = ;

c語言結構體能否整體賦值

5樓:八哥說科技

可以的,但需要保證是具有相同結構的結構體變數。

可以將乙個結構體變數的值賦給另乙個具有相同結構的結構體變數。如student1和student2都是student型別的變數,可以這樣賦值:student1= student2;

假設申明了兩個成員列表完全一樣的兩個結構體,編譯器會當作兩個完全不同的型別,即使他們的成員列表是一樣的,令兩個結構體的變數間賦值,則是非法的。

6樓:初出茅廬

可以是可以,但它有乙個條件,這裡的賦初值不是想別的資料型別(如 int a;a=5;)它必須是對結構體中的每個成員以此賦值的,你可以從樓上所寫的例子看出這一點。

將乙個結構體變數的值直接賦給另外乙個結構體變數的時候,這兩個結構體必須是相同結構體名。

7樓:六春荷鞏暄

相同型別的結構體是可以直接賦值的,這是ansi/isoc規定的。ansi/iso

c規定的合法行為,編譯器是必須支援的。

但不能進行比較,例如

if(stu[1]

==stu[2])是不允許的。

這種問題不能靠試驗獲得準確的答案,因為你用的編譯器支援並不表明其他編譯器也支援。

8樓:

可以的:

#include "stdio.h"

struct date

d1=;

void main()

9樓:星北城南

結構體可以整體賦值為0,如果要給陣列賦值就比較麻煩,用指標會好一點

c語言結構體中的乙個char陣列怎麼賦值?

10樓:

常用兩種措施:

在宣告結構體變數時初始化,如——

//#include "stdafx.h"//if the vc++6.0, with this line.

#include "stdio.h"

struct stu;

int main(void);//這樣初始化printf("%d %s\n",s.x,s.name);

return 0;

}向陣列裡直接拷貝字串,如——

//#include "stdafx.h"//if the vc++6.0, with this line.

#include "stdio.h"

#include "string.h"

struct stu;

int main(void)

11樓:凌亂心扉

(1)用字元常量逐個初始化陣列。例如:

char a[8]=;

把8個字元依次分別賦給c[0]~c[7]這8個元素。

如果在定義字元陣列時不進行初始化,則陣列中各元素的值是不可預料的。如果花括號中提供的初值個數(即字元個數)大於陣列長度,則出現語法錯誤。

如果初值個數小於陣列長度,則只將這些字元賦給陣列中前面那些元素,其餘的元素自動定為空字元(即'\0')。

如果提供的初值個數與預定的陣列長度相同,在定義時可以省略陣列長度,系統會自動根據初值個數確定陣列長度。

例如:char c=;

這時c陣列的長度自動定為9。也可以定義和初始化乙個二維字元陣列,例如:

char diamond[5][5]=,,,

,};用它代表乙個菱形的平面圖形。

(2)字串常量初始化陣列。例如:

char c=;

可寫為:char c=;

或去掉{}寫為:char c="c program";

注意:此時陣列c的長度不是9,而是10。因為字串常量的最後由系統加上乙個'\0'。上面的初始化與下面的初始化等價。

char c=;

其定義的一般形式是:char陣列名[資料長度]

例如:char c[10];

c[0]='i';c[1]='';c[2]='l';c[3]='o';c[4]='v';c[5]='e';c[6]='';c[7]='y';c[8]='o';c[9]='u';

以上定義了c為字元陣列,包含10個元素。

由於字元型資料是以整數形式(ascii**)存放的,因此也可以用整型陣列來存放字元資料,例如:

int c[10];

但這時每個陣列元素佔2個位元組的記憶體單元,浪費儲存空間。

字元陣列也可以是二維或多維陣列,例如:

char c[5][10];

即為二維字元陣列。

初始化字元陣列的初始化與數值型陣列初始化沒有本質區別。但它除了可以逐個給陣列元素賦予字元外,也可以直接用字串對其初始化。

輸入輸出

字元陣列的輸入

(1)用getchar()或scanf()的'%c'格式符對陣列進行字元賦值。例如,對於陣列a[10]:用getchar()賦值:

for(i=0;i<10;i++)

a=getchar();

用scanf()賦值:

for(i=0;i<10;i++)

scanf("%c",&a);

(2)用scanf()的'%s'格式對陣列賦值。還是對於陣列a[10]:

scanf("%s",a);

或scanf("%s「,&a[0]);

輸入」c program「並回車時,a陣列會自動包含乙個以」\0「結尾的字串」c program「。

字元陣列的輸出

(1)用putchar()或printf()的『%c』格式符對陣列進行字元賦值。例如,對於陣列a[10]:用putchar()賦值:

for(i=0;i<10;i++)

a=putchar();

用printf()賦值:

for(i=0;i<10;i++)

printf("%c",a);

輸出結果為:

c program

(2)用printf()的'%s'格式對陣列賦值。還是對於陣列a[10];

printf("%s",a);

輸出結果為:

c program

12樓:禮浦業雲韶

好吧,比如:

struct

emu=

那麼對char

ch賦值可以

for(j=0;j<=49;j++)

emu.ch[j]=j;

或者乙個字元乙個字元的賦值,比如emu.ch[0]='a';

對字串的賦值不能直接等於,要用函式strcpy,

13樓:匿名使用者

st.name="123"; 非法,常量字串不能直接賦值給字元陣列,因為st.name 位址是確定的,不能再改了。

char name[10]="123";可以的,定義時,進行初始化字元陣列。

14樓:匿名使用者

可以用string.h,標頭檔案裡面的strcpy()函式,拷貝

c語言為什麼結構體宣告的時候可以直接賦值,後面的就不行

15樓:風若遠去何人留

宣告的時候和後續賦值略有不同,在c語言中是兩種處理方法。

如有結構體

struct test

;定義的時候,可以

struct test var = ;

這樣初始化,結果為var.a = 1, var.c = 'c', var.b = 2;

但是如果後續賦值

var = ;

就會報錯。因為在c語言中不支援這種形式的操作。

不過可以取巧轉換一下,改成

var = (struct test);

這樣就可以了。 在這種情況下,系統會申請乙個臨時變數,並初始化為該值,再對var進行賦值。而同型別結構體之間賦值操作是c語言規則允許的。

16樓:匿名使用者

這個涉及到乙個臨時變數的問題,因為後面的a=; 不在結構體定義裡面了,出了這個結構體系統就無法識別了,所以會提示錯誤。

17樓:匿名使用者

你那個第一種做法叫初始化,c語言允許結構體初始化,但不允許第二種那樣賦值

如果你寫

struct student

;struct student a=;

也是對的,這就叫初始化

至於怎麼樣才能做到直接賦值,c語言裡面並沒有這樣的操作過載操作符也是c++裡面的了

不過你可以這樣struct student b=;a=b;

c語言裡面2個結構體之間是可以複製的

或者你也可以定義乙個函式來做,函式體裡面要用挨個賦值的方式希望對你有幫助

結構體型別的長度計算,C語言中結構體陣列長度怎麼計算

計算方法 運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小...

C語言中指標陣列結構體佇列堆疊變數區別

指標就是指位址 陣列的位址在定義變數時就已經給定了,不能再變化,其大小也是定了的,陣列可以通過下表訪問,這是陣列的方便之處,但是,陣列可能存在越界訪問和浪費空間的問題 結構體就是將以個專案的所有的屬性放在一起,這樣方便操作 佇列有先進先出的原則 堆疊是儲存空間的概念,c語言中的區域性變數就是儲存在棧...

結構體再函式中的作用,c語言中結構體的作用到底是幹什麼的,能通俗點講嗎

結構體和其他型別基礎資料型別一樣,例如int型別,char型別只不過結構體可以做成你想要的資料型別。以方便日後的使用。在專案中,結構體是大量存在的。研發人員常使用結構體來封裝一些屬性來組成新的型別。結構體在函式中的作用不是簡便,其最主要的作用就是封裝。封裝的好處就是可以再次利用。讓使用著不必關係這個...

C語言結構陣列刪除,在C語言中,怎麼刪除乙個結構體陣列中的資料

對於陣列刪除,一般就是使用後面陣列元素前移的操作,來覆蓋前一元素,達到刪除的效果。例如陣列a 10 要刪除a 5 這個元素,那麼只需要把後面的元素前移一位就行了,也就是a 5 a 6 a 6 a 7 a 7 a 8 這樣子a 5 這個元素的內容就會被全部抹殺掉了。不過這裡存在乙個問題,你乙個結構體陣...

c語言中的二維陣列問題,c語言問題 c語言中二維陣列在記憶體中怎樣儲存?

目的是將緩衝區中輸入流中資料清除,可以使用 fflush stdin 清除資料 gets函式會把前面在scanf函式的輸入結束符即回車當做第乙個字串資料的結束符接收,因此不加gets s 就會導致資料個數少乙個。當然使用gets s 會提前接收了回車,因此也是起到同樣的作用。你程式函式中有個錯誤,p...