admin 管理员组

文章数量: 887007

关于‘\0’和‘\n’的去留问题

目录

  • scanf
  • gets
  • strcpy
  • strncpy
  • strcat
  • strncat
  • 总结

scanf

scanf函数在读取字符串的时候是不会读取空格、Tab、\n的;
并且scanf会自动给字符串添加\0
scanf函数在读取字符串结束时,并不会清理缓冲区,上一次操作留下的\n还在:

这也就提醒我们再利用scanf读取字符串或者字符完成后记得清理缓冲区,避免为后续的操作造成不必要的麻烦!!!

gets

gets函数用来读取字符串,除了\n不能读取之外啥都能读取,并且在完成读取的时候会自动在字符串末尾加\0,同时会清理掉这次遗留在缓冲区的\n;
实际上gets的读取机制是这样的:gets遇到\n就会停止读取,表示这次读取已经结束,并且会在末尾自动加上\0,同时完成缓冲区的清理(清理掉这次遗留在缓冲区的\n);

strcpy

是会将所有源头字符串的数据拷贝到目标字符串的,当然包括\0!!!

strcpy工作机制就是在源头字符串遇到\0,就停止拷贝同时会把\0也拷贝进目标字符串;

strncpy

strcpy如果需要拷贝的个数(也就是n)大于源头字符串的长度,那么strncpy会将整个源头拷过来,对于多出来的个数n则用\0来填充:

如果如果需要拷贝的个数(也就是n)小于等于源头字符串的长度,则strncpy就会拷贝需要的字符串个数同时不会多此一举给你自动的把\0也拷贝过来:

strcat

字符串拼接函数,工作机制就是:在目标字符串末尾(\0位置处)开始拼接源头字符串,直到源头字符串遇到\0位置,当然strcat会将\0也自动拼接过去:

strncat

当我们需要拼接的个数大于源头字符串的个数那么strncat就等价于strcat,同时他不会像strncpy那样将多余的n用\0来填充;!!!

当我们需要拼接的个数小于、等于源头字符串的个数那么strncat就会有多少拼接多少,但是拼接完成过后会自动加上\0;

总结

当需求数n小于等于实际源头字符串长度时:
strncpy就会有多少拷贝多少,不会拷贝\0;
strncat就是有多少拼接多少,并且会在末尾自动添加\0;
当需求数n大于实际源头字符串长度时:
strncpy就会将有效数据先全部拷贝进目标数组,然后多出来的n就会用\0来填充;
strncat这时就等价于strcat,对于多余的n,不会用\0来填充;

本文标签: 关于’和n’的去留问题