簡體   English   中英

將 n 個整數添加到字符串中如何減去前 n 個字符?

[英]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.

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