簡體   English   中英

字符串和指針

[英]strings and pointers

我是C的新手,並審查了一些源代碼。 但我不確定此代碼段發生了什么。

我真的不認為它正在做任何事情,因為在調試中輸出似乎與tempstr相同。

這就是我的想法,如果我錯了就更正。 *(tempstr + strlen(line))是將行的長度添加到tempstr並解除引用並將0x0轉換為char?

char line[128], tempstr[128]

strcpy(line, "AUTO_ANSWER_CALL = 1");
strcpy(tempstr,line);
*(tempstr + strlen(line)) = (char) 0x0; // Confusing part

首先,請注意代碼是垃圾。

*(tempstr + strlen(line)) = (char) 0x0;

看起來原作者不太確定strcpy復制了終止的nul字符,因此他更加確定而不是檢查手冊(順便說一句, strcpy會復制終止空值 )。

這基本上與以下相同:

tempstr[ strlen(line) ] = (char) 0;

我想,轉換為char是因為有可能使用C ++編譯器來編譯此代碼。

我不知道為什么

char line[128] = "AUTO_ANSWER_CALL = 1";

是不可接受的。

這是一個指針值:

tempstr

這是另一個指針值(指向超出tempstr指針值的5元素):

tempstr + 5

這是一個整數:

strlen(line)

因此,這是一個指針值(指向超出tempstr指針值的strlen(line)元素):

tempstr + strlen(line)

這是取消引用該指針:

*(tempstr + strlen(line))

這就是我的想法,如果我錯了就更正。 *(tempstr + strlen(line))是將行的長度添加到tempstr並解除引用並將0x0轉換為char?

它確保臨時超出“AUTO_ANSWER_CALL = 1”字符的tempstr索引20處的字符為空:即確保字符串以空值終止。

順便說一句,該字符串已經以null結尾(因此最后一個語句是redundent):因為strcpy復制包含隱式空終止字符的字符串。


僅僅執行以下tempstr [sizeof(tempstr)-1] ='\\ 0'並不容易; 這更容易理解。

這些不是一回事: strlen(line)等於20,但sizeof(tempstr)等於128。


這會工作:tempstr [strlen(tempstr)] ='\\ 0'

這與以下內容完全相同:

*(tempstr + strlen(tempstr)) = '\0'

只是一種不同的寫作方式。

但是,如果tempstr不是以null結尾的字符串,則長度也將為128。

如果tempstr不是一個空終止字符串,那么strlen(tempstr)是未定義的('undefined'意味着它沒有意義且危險,一個錯誤,不應該使用): strlen函數無效,除非它在a上使用已經以null結尾的字符串。

它什么都不做。 它嘗試null終止已終止的字符串。

在我看來它是在使用strcpy()將數據復制到tempstr的數據末尾放置一個空終止符(Char 0

strcpy(tempstr, line)

的內容復制到tempstr中 ,但作者可能不確定tempstr在此操作后是否將以null結尾。 我的C生銹了,公平地說,我也不確定。 :)

但是,為了使代碼按預期工作,我認為linetempstr必須已經為空終止( strlen( line將計入第一個null終止符),因此為了使代碼按預期工作,它也必須完全冗余,因為strcpy()在復制第一行的行時會復制空終止符!

//令人困惑的部分實際上是一個空操作,可以刪除。 :)

正如其他人所說,代碼基本上是在字符串末尾添加'\\ 0',即使它已經存在。 這是所有代碼還是介於兩者之間? 如果在這些行之間使用memcpy(),可能會有所幫助。 在較輕松的音符上,代碼可能是由一個患有自卑感的近視極客寫的。

是的,這段代碼是零終止字符串。

*(tempstr + strlen(line)) = (char) 0x0; // Confusing part
// or
tempstr[strlen(line)]) = '\0'; // null terminate

這是多余的,因為strcpy()無論如何都會這樣做。

它有助於理解像"AUTO_ANSWER_CALL = 1"這樣的字符串常量必須假定為不可變的。 那么這里發生了兩個字符串緩沖區:

char line[128], tempstr[128]; // <== better have the semicolon

在這一點上,他們的內容是完全未知的。

接下來,將准備好的文本復制到其中一個文本中。

strcpy(line, "AUTO_ANSWER_CALL = 1");

然后進入另一個

strcpy(tempstr,line);

最后,使用一個小指針算法將空字符'\\0' == 0x0粘貼到末尾,以確保字符串被正確終止:

*(tempstr + strlen(line)) = (char) 0x0; // Confusing part

這相當於

tempstr[strlen(line)] = (char) 0x0;

暫無
暫無

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

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