[英]Using strcpy() to assign values to a struct. Program doesnt run
我是 c 的新手,我正在嘗試使用 strcpy 為結構賦值(我嘗試使用左值方法使用賦值並引發錯誤)。 我嘗試運行該程序,但沒有任何反應。 我的代碼中的錯誤在哪里? 我正在使用代碼塊來運行程序。
#include <stdio.h>
#include <stdlib.h>
int main(){
struct student{
char name[25];
int age;
};
struct student s1;
strcpy(s1.name, "Sammy");
strcpy(s1.age, "18");
printf("%s, %d", s1.name, s1.age);
}
刪除這個:
strcpy(s1.age, "18");
你可以正常賦值。 s1.age = 18;
首先要做的是閱讀來自編譯器的警告,因為它們包含有關代碼問題的寶貴信息。 使用 gcc 和 clang 編譯原始代碼會給出以下警告:
鐺:
so5.c:12:12: 警告:不兼容的整數到指針轉換將“int”傳遞給“char *”類型的參數 [-Wint-conversion]
海灣合作委員會:
so5.c:12:12: 警告:傳遞參數 1 的 'strcpy' 使指針從整數而不進行強制轉換 [-Wint-conversion] strcpy(s1.age, "18");
所以違規行是:
strcpy(s1.age, "18");
首先將未初始化的 s1.age 視為指針並嘗試將字符串復制到這個未知位置。 這很可能會導致分段錯誤。
你當然可以制作一個指針並用"18"
填充它的內存內容
strcpy(&s1.age, "18");
但是等待這會導致打印如下:
薩米,14385
因為字符串是用ascii編碼的,三個字節0x31,0x38,0
當寫入int age
字段的位置時為0x003831
或十進制14385
。 然而,這純粹是運氣,鉸孔字節被隨機初始化為 0。
為年齡賦值的正確方法是賦值:
s1.age = 18;
strcpy()用於將字符串復制到字符緩沖區。 與strcpy(s1.age, "18");
,您正在嘗試從字符串18
的地址讀取某些內容並將其寫入s1.age
,這是一個int
。
要么將age
成員聲明為char
數組,就像您對name
所做的那樣(盡管這會限制您對age
進行算術運算)。 或者,使用賦值運算符=
分配一個int
。 比如: s1.age = 18;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.