显而易见,但我认为知道字符串只是由一个零字节分隔的字节数组很重要。正如您可能知道的那样,C字符串并不是非常用户友好的。
if( s1 == s2 )
doStuff(s1);
You have to compare every character in the string. Use strcmp or better strncmp.
if( strncmp( s1, s2, BUFFER_SIZE ) == 0 )
doStuff(s1);
memmove()
或memcpy()
,否则不能安全地使用strncat()
。特别是,除非您知道*target == '\0'
,否则strncat(target, source, sizeof(target))
是不正确的。通常使用strncat()
是一个错误。 - Jonathan Leffler滥用strlen()会严重影响性能。
for( int i = 0; i < strlen( string ); i++ ) {
processChar( string[i] );
}
如果不加优化,时间复杂度至少为O(n2)。
int length = strlen( string );
for( int i = 0; i < length; i++ ) {
processChar( string[i] );
}
该算法的时间复杂度至少为O(n)。对于那些没有花时间思考的人来说,这并不是那么显而易见。
strlen()
函数一次吗? - galoisstrtok
:strcspn(string, delimiters)
strspn(string, delimiters)
第一个函数在你传入的分隔符集合中找到第一个字符。第二个函数在你传入的非分隔符集合中找到第一个字符。
我更喜欢这些函数而不是 strpbrk
,因为如果它们无法匹配,它们会返回字符串的长度。
str[0]
相当于 0[str]
,或者更一般地说,str[i]
是 i[str]
,而 i[str]
是 *(str + i)
。
NB
这不仅适用于字符串,也适用于 C 数组。
3["hello"]
等价于 "hello"[3]
这样的事情,虽然是真的,但实际上只是一些古怪的琐事,没有人会使用。 - Adam Rosenfield标准库中的 str
n
*
变体并不一定会将目标字符串以 null 结尾。
例如:MSDN 在 strncpy
的文档中如下描述:
strncpy 函数将 strSource 的前 count 个字符复制到 strDest 中,并返回 strDest。如果 count 小于或等于 strSource 的长度,则不会自动将 null 字符附加到已复制的字符串中。 如果 count 大于 strSource 的长度,则会使用 null 字符填充目标字符串,直到其长度为 count。
strtok
不是线程安全的,因为它使用一个可变的私有缓冲区在调用之间存储数据;您也不能交错或嵌套 strtok
调用。
一个更有用的替代方法是 strtok_r
,尽可能使用它。
在使用字符串时,不要混淆strlen()
和sizeof()
:
char *p = "hello!!";
strlen(p) != sizeof(p)
sizeof(p)
在编译时返回指针的大小(4或8字节),而strlen(p)
在运行时计算以null结尾的字符数组的长度(在本例中为7)。
kmm已经有一个很好的列表。以下是我在开始编写C代码时遇到的问题:
字符串字面量有自己的内存部分,并且始终可访问。因此,它们可以是函数的返回值。
字符串的内存管理,尤其是使用高级库(而不是libc)。如果字符串由函数返回或传递给函数,谁负责释放它?
何时应使用“const char *”,何时应使用“char *”。如果函数返回“const char *”,这告诉我什么。
所有这些问题并不太难学习,但如果没有人教你,很难弄清楚。
我发现char buff[0]
技术非常有用。考虑以下内容:
struct foo {
int x;
char * payload;
};
对比
struct foo {
int x;
char payload[0];
};
请查看https://dev59.com/tXVC5IYBdhLWcg3wcgmd。
有关影响和变化,请参见链接。
char* triple(char* source)
{
int n=strlen(source);
char* dest=malloc(n*3+1);
strcpy(dest,src);
strcat(dest,src);
strcat(dest,src);
return dest;
}
a[i]
相当于*(a+i)
,也就是说a[0]
相当于*(a+0)
,而*(a+0)
又等同于*a
。 - Chucka
的第一个元素和a
指向的元素有什么不同吗?否则,你刚才说它们是相同的。 - Chuck