C中的字符串:陷阱和技巧

Der*_*unk 10 c string

我将执教的ACM队下月(去图),时间已经到了谈论C.字符串除了对标准库的讨论,strcpy,strcmp等等,我想给他们一些提示(像str[0] is equivalent to *str,以及类似的东西).

你知道任何名单(如备忘单)或你自己的经验吗?

我已经知道ACM比赛的书籍了(这很好,尤其是这个),但我是在追逐交易的技巧.

谢谢.

编辑:非常感谢大家.我会接受投票最多的答案,并且适当地支持我认为相关的其他人.我希望在这里做一个总结(就像我在这里做的那样,asap).我现在有足够的材料,我确信这极大地改善了字符串的会话.再一次,谢谢.

kmm*_*kmm 26

这很明显,但我认为知道字符串只不过是一个由零字节分隔的字节数组是很重要的.你可能知道C字符串并不是所有用户友好的.

  • 在字符串中的某处写一个零字节将截断它.
  • 走出界限通常会结束.
  • 永远不要使用strcpy,strcmp,strcat等,而是使用他们的安全变体:strncmp,strncat,strndup,...
  • 避免strncpy.strncpy并不总是零划分你的字符串!如果源字符串不适合目标缓冲区,则会截断字符串,但不会在缓冲区末尾写入nul字节.此外,即使源缓冲区比目标缓冲区小,strncpy仍然会用零覆盖整个缓冲区.我个人使用strlcpy.
  • 不要使用printf(string),而是使用printf("%s",string).如果用户在字符串中放入%d,请尝试考虑后果.
  • 你无法比较字符串
    if( s1 == s2 )
                doStuff(s1);
    Run Code Online (Sandbox Code Playgroud) 您必须比较字符串中的每个字符.使用strcmp或更好的strncmp.
    if( strncmp( s1, s2, BUFFER_SIZE ) == 0 )
             doStuff(s1);
    Run Code Online (Sandbox Code Playgroud)

  • 如果你真的使用printf而不是一个做其他事情的包装器宏,那么puts/fputs就是你正在寻找的功能. (4认同)

sha*_*oth 5

滥用strlen()将极大地恶化性能.

for( int i = 0; i < strlen( string ); i++ ) {
    processChar( string[i] );
}
Run Code Online (Sandbox Code Playgroud)

将具有至少O(n 2)时间复杂度,而

int length = strlen( string );
for( int i = 0; i < length; i++ ) {
    processChar( string[i] );
}
Run Code Online (Sandbox Code Playgroud)

将具有至少O(n)时间复杂度.对于那些没有时间去思考它的人来说,这并不是那么明显.