问题描述
在试图找出如何比较字符串的结尾时,很多答案提示:
(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]
,在此之后,如果打印s
和printf
一起将打印所有字符,直到找到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所述。