向字符串中添加n个整数如何导致减去前n个字符?

问题描述

在试图找出如何比较字符串的结尾时,很多答案提示

(strncmp(string1 + length_string1 - length_string2,string2,length_string2)

很好用,我了解strncmp的基本实现,但是我很难理解以下表达式的工作原理:

string1 + length_string1 - length_string2

如何在+(字符串1)和const char*(或int)(length_string1)中使用size_t运算符strncmp,但是当我编译以下内容

int n = string1 + length_string1 - length_string2;

我得到一个错误?该错误是有道理的(当然不能使用字符串初始化int),但是能够在strncmp内执行此操作使我逃避了。

在某些函数中使用n添加string1时会删除n个字符的感觉如何?例如:

尝试在printf("%s",s + 3);上打印const char* s = "Hello World";的{​​{1}}时,为什么会发生这种情况?

解决方法

示例:

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

输出:lo World

解释:

您的“ printf()”示例只是简单地从第四个字符而不是第一个字符打印“ Hello World”。

这不是在“减去”任何东西。它只是从一个不同的地方开始:)

完整示例:

#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个内存地址,并指向{{1} }。

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

,

const char*是一个指针,因此,与所有其他指针一样(除非它们是恒定的),如果您向其添加标量,它将使该指针与标量的递增次数相同提供。

s + 3使得指针将指向第四个字符的地址,即字符串的&s[3],相当于具有s = &s[3],在此之后,如果打印sprintf一起将打印所有字符,直到找到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*参数,如上一个paragraf所述。