[英]Adding an integer to C-String while printing
int main(){
printf("hello world"+2);
}
test.c:32:25: warning: adding 'int' to a string does not append to the string
[-Wstring-plus-int]
printf("hello world"+2);
~~~~~~~~~~~~~^~
test.c:32:25: note: use array indexing to silence this warning
printf("hello world"+2);
^
& [ ]
1 warning generated.
alpha@Desktop % ./a.out
llo world%
所以這就是我得到的。 如果我增加數字,那么它只是將字符串切片。誰能解釋這個輸出以及為什么它會發生在我身上?
在 C 和 C++ 語言中,每個用雙引號定義的字符串都是char*
類型(指向 char 的指針)作為靜態分配的 char 數組。 當您在此類字符串上調用printf()
時,它會執行以下操作:
void printf(char* str) {
while(*str!= '\0') {
// write the current character to stdout
write(STDOUT_FILENO, str, sizeof(char));
str ++;
}
}
我不知道它是否真的是這樣寫的,確實可能不是,功能是一樣的。 它遍歷字符串,直到找到空終止符 ( '\\0'
)。 所有的指針幾乎都等價於long
並且當你向它們添加一個數字時,它會用sizeof(type)
增加它們的基礎值,其中 type 是指針指向的值的類型。 因此,當您向“Hello World”添加一個數字時,會使printf()
認為您的字符串從不同的內存地址開始並打印“llo World”。
如果您想打印字符串末尾附加值 '2' ,如@Elliott Frisch 所述,您將使用print("Hello World%d", 2)
。
我建議在 C 中查看sprintf()
和strcat()
以進行字符串連接。
在 C 中,我們可能認為的字符串實際上是一個字符數組。 在這兩種情況下,您傳遞給printf()
是指向此類數組開頭的指針。 您可以使用指針進行算術運算,這就是您在這里所做的。
這里有一些澄清。
#include <stdio.h>
int main(void) {
// A
printf("Hello, world!\n");
// B
printf("Hello, world!\n" + 2);
}
輸出:
Hello, world!
llo, world!
在A 的情況下,您指向包含H
字符的數組的開頭,它會讀取到最后一個(實際上是“這是結尾”字符: \\0
)。
⬇️ | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
H | 電子 | 升 | 升 | ○ | , | 瓦 | ○ | r | 升 | d | ! | \\n |
\\0 |
在情況 B 中,在將指針傳遞給printf()
之前將其加 2。 現在printf()
從這里開始閱讀:
⬇️ | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
H | 電子 | 升 | 升 | ○ | , | 瓦 | ○ | r | 升 | d | ! | \\n |
\\0 |
這就是導致您“切片”的原因。
C 語言的規則不允許你做這樣的事情。 您的問題可以與為什么我將牛奶而不是汽油倒入汽車油箱的問題進行比較,但它沒有。 計算機只是一個愚蠢的硬件,它只能做它所教的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.