将 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/).
在试图找出如何比较字符串的结尾时,很多答案建议:
(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/).