将 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

您如何将 + 运算符与 const char* (string1) 和 int(或 size_t)一起使用(length_string1) 在 strncmp 里面但是当我编译下面的内容时

int n = string1 + length_string1 - length_string2;

我收到错误消息?该错误是有道理的(当然不能使用字符串初始化 int),但在 strncmp 内部执行此操作的能力让我望而却步。

在某些函数中使用时,如何将 n 值添加到 string1 删除前 n 个字符?例如:

在试验 printf("%s", s + 3);const char* s = "Hello World"; 打印了 lo World,为什么会出现这种情况?

A 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);

输出:

lo world!
Hello world!

注意字符串还在,可以将指针再次指向字符串的开头

int n = string1 + length_string1 - length_string2; 不起作用,因为您将 const char*char* 分配给 int,并且它们不兼容。

(strncmp(string1 + length_string1 - length_string2, string2, length_string2) 正常工作,因为您传递了正确的参数 2 char* 个参数,如前一段所述。

示例:

const char* s = "Hello World"
printf("%s", s + 3);

输出: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 的值作为内存地址,将整数 n 添加到其值会将其转换为 n 个内存地址,并将指向 p+n.

最后,您不能执行 int n = string1 + length_string1 - length_string2; 的原因是因为 string1 + length_string1 - length_string2 不是 int,而是 char* 类型的指针。如果你真的想将指针的值解释为一个整数,你可以使用 atoi (http://www.cplusplus.com/reference/cstdlib/atoi/).