[英]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生銹了,公平地說,我也不確定。 :)
但是,為了使代碼按預期工作,我認為line和tempstr必須已經為空終止( 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.