[英]How does adding n integers to a string result in subtracting the first n characters?
在試圖找出如何比較字符串的末端時,很多答案表明:
(strncmp(string1 + length_string1 - length_string2, string2, length_string2)
很好用,我了解strncmp
的基本實現,但我很難理解以下表達式的工作原理:
string1 + length_string1 - length_string2
您如何能夠將+
運算符與 strncmp 內部的const char*
(string1) 和int
(或size_t
) ( strncmp
) 一起使用,但是當我編譯以下內容時
int n = string1 + length_string1 - length_string2;
我得到一個錯誤? 該錯誤是有道理的(當然,不能使用字符串初始化 int)但是在strncmp
內部執行此操作的能力使我回避了。
在某些函數中使用時,向string1
添加n
值如何刪除前n
字符? 例如:
在試驗printf("%s", s + 3);
其中const char* s = "Hello World";
它打印了lo World
,為什么會發生這種情況?
例子:
const char* s = "Hello World"
printf("%s", s + 3);
OUTPUT: lo World
解釋:
您的“printf()”示例只是打印“Hello World”......從第 4 個字符開始,而不是第一個字符。
它不是“減去”任何東西。 它只是從不同的地方開始:)
完整示例:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
const char* s = "Hello World";
const char a[] = "Hello World";
printf("%s\n", s); // "Hello World"
printf("%s\n", s + 3); // "lo World"
printf("strlen(s):%ld\n", strlen(s)); // 11 character string
printf("strlen(s+3):%ld\n", strlen(s+3)); // 8-character string
printf("sizeof(s): %ld\n", sizeof(s)); // 8: 64-bit pointer
printf("sizeof(a): %ld\n", sizeof(a)); // 12: char[12] (11 characters, + delimiter)
return 0;
}
在 C 中,字符串是 char 的不可變數組,數組由指向第一個元素的指針及其大小定義。
例如, char* my_string
和之后的my_string = new char[10]
將創建與char[10] my_string
。
現在考慮將指針p
的值作為 memory 地址,將 integer n
添加到其值將轉換為n
memory 地址,並將指向p+n
。
最后你不能做的原因int n = string1 + length_string1 - length_string2;
是因為string1 + length_string1 - length_string2
不是int
而是char*
類型的指針。 如果您真的想將指針的值解釋為 integer 您可以使用 atoi ( http://www.cplusplus.com/reference/cstdlib/atoi/ )。
const char*
是一個指針,因此,與所有其他指針一樣(除非它們是常量),如果向它添加一個標量,它將使指針增加與提供的標量相同的次數。
s + 3
使得指針將指向第 4 個字符的地址,指向字符串的&s[3]
,這相當於擁有s = &s[3]
,在此之后如果您使用printf
打印s
,它將從那里打印所有字符,直到找到一個 nul 字符,當你使用"%s"
說明符時它會做什么。
請注意,字符不會被刪除,只是指針在前面。
拿下代碼:
const char *s = "Hello world!";
s += 3; //increment 3 times
printf("%s\n", s);
s -= 3; //decrement 3 times
printf("%s\n", s);
output:
lo world!
Hello world!
注意字符串還在,你可以再次將指針指向字符串的開頭。
int n = string1 + length_string1 - length_string2;
不起作用,因為您將const char*
或char*
分配給int
並且這些是不兼容的。
(strncmp(string1 + length_string1 - length_string2, string2, length_string2)
可以正常工作,因為您傳遞了正確的 arguments 2 char*
arguments,如上一段所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.