通过在 C 中执行 "string" + 1 来截断
truncate by doing "string" + 1 in C
我最近在堆栈溢出时遇到了以下代码 (see the whole post here):-
char *c = "200939915";
char *d = c + 1;
它给 d 赋值“00939915”,我觉得这很违反直觉。
谁能解释一下这个过程的机制?
这个东西叫什么?
我是一名大一学生,正在学习 CS 入门课程,所以这会很有帮助:)
char *c = "200939915";
这里的c
是一个指向一个字符的指针(200939915
的第一个字符)。
c+1
将指向下一个字符。
(2 0 0 9 3 9 9 1 5)
^ ^
| |
c c+1
c[0] = 2
c[1] = 0
c[2] = 0
c[3] = 9
等等。
c
是第一个字符 2
的地址。所以 d
是地址 c
+ 1,因此在这种情况下是第一个 0
的地址。
d
不"contain"你说的值。
d
是指向 char
的指针,通过将其设置为 c+1
,它指向(包含内存地址)您声明的字符串文字的第二个元素。
我猜你做了这样的事情 printf("%s",d);
这导致 printf 从 d
指向的位置开始读取内存并输出那里的每个字符,直到它捕获 '[=16=]'
(字符串结尾)然后完成。
它不会截断您的字符串,您只是在另一个位置开始阅读它。
正如@Gaurav Sehgal 指出的那样,您的变量仅指向字符串,而不是数字。你期望 d 的值在这里是什么:
char *c = "abcdefghi";
char *d = c + 1;
我最近在堆栈溢出时遇到了以下代码 (see the whole post here):-
char *c = "200939915";
char *d = c + 1;
它给 d 赋值“00939915”,我觉得这很违反直觉。
谁能解释一下这个过程的机制? 这个东西叫什么?
我是一名大一学生,正在学习 CS 入门课程,所以这会很有帮助:)
char *c = "200939915";
这里的c
是一个指向一个字符的指针(200939915
的第一个字符)。
c+1
将指向下一个字符。
(2 0 0 9 3 9 9 1 5)
^ ^
| |
c c+1
c[0] = 2
c[1] = 0
c[2] = 0
c[3] = 9
等等。
c
是第一个字符 2
的地址。所以 d
是地址 c
+ 1,因此在这种情况下是第一个 0
的地址。
d
不"contain"你说的值。
d
是指向 char
的指针,通过将其设置为 c+1
,它指向(包含内存地址)您声明的字符串文字的第二个元素。
我猜你做了这样的事情 printf("%s",d);
这导致 printf 从 d
指向的位置开始读取内存并输出那里的每个字符,直到它捕获 '[=16=]'
(字符串结尾)然后完成。
它不会截断您的字符串,您只是在另一个位置开始阅读它。
正如@Gaurav Sehgal 指出的那样,您的变量仅指向字符串,而不是数字。你期望 d 的值在这里是什么:
char *c = "abcdefghi";
char *d = c + 1;