字符串常量:
字符串常量也叫字符串字面值,是用双引号括起来的0个或多个字符组成的字符序列。双引号不是字符串的一部分,它只用于限定字符串。
从技术角度看,字符串常量就是字符数组。字符串的内部表示使用一个空字符'\0'作为串的结尾,因此,存储字符串的物理存储单元比括在双引号中的字符数多一个。这种表示方法也说明,C语言对字符串的长度没有限制,但程序必须扫描完整个字符串后才能确定字符串的长度。
标准库函数strlen(s)可以返回字符串参数s的长度,但长度不包括末尾的'\0'。
下面给出strlen()的两个版本:
1
int
strlen(
char
s[])
2 {
3 int n;
4 n = 0 ;
5 while (s[n] != ' \0 ' )
6 {
7 ++ n;
8 }
9 return n;
10 }
2 {
3 int n;
4 n = 0 ;
5 while (s[n] != ' \0 ' )
6 {
7 ++ n;
8 }
9 return n;
10 }
为什么代码不会自动排版了....无语
1
int
strlen(
char
*
s)
2 {
3 char * p = s;
4 while ( * p != ' \0 ' )
5 {
6 p ++ ;
7 }
8 return p - s;
9 }
2 {
3 char * p = s;
4 while ( * p != ' \0 ' )
5 {
6 p ++ ;
7 }
8 return p - s;
9 }
标准头文件:<string.h>中声明了strlen和其他字符串函数
该头文件中含有这样一段代码:
#ifndef RC_INVOKED
#ifdef __cplusplus
extern " C " {
#endif
/*
* Prototypes of the ANSI Standard C library string functions.
*/
_CRTIMP void * __cdecl memchr ( const void * , int , size_t) __MINGW_ATTRIB_PURE;
_CRTIMP int __cdecl memcmp ( const void * , const void * , size_t) __MINGW_ATTRIB_PURE;
_CRTIMP void * __cdecl memcpy ( void * , const void * , size_t);
_CRTIMP void * __cdecl memmove ( void * , const void * , size_t);
_CRTIMP void * __cdecl memset ( void * , int , size_t);
_CRTIMP char * __cdecl strcat ( char * , const char * );
_CRTIMP char * __cdecl strchr ( const char * , int ) __MINGW_ATTRIB_PURE;
_CRTIMP int __cdecl strcmp ( const char * , const char * ) __MINGW_ATTRIB_PURE;
_CRTIMP int __cdecl strcoll ( const char * , const char * ); /* Compare using locale */
_CRTIMP char * __cdecl strcpy ( char * , const char * );
_CRTIMP size_t __cdecl strcspn ( const char * , const char * ) __MINGW_ATTRIB_PURE;
_CRTIMP char * __cdecl strerror ( int ); /* NOTE: NOT an old name wrapper. */
_CRTIMP size_t __cdecl strlen ( const char * ) __MINGW_ATTRIB_PURE;
#ifdef __cplusplus
extern " C " {
#endif
/*
* Prototypes of the ANSI Standard C library string functions.
*/
_CRTIMP void * __cdecl memchr ( const void * , int , size_t) __MINGW_ATTRIB_PURE;
_CRTIMP int __cdecl memcmp ( const void * , const void * , size_t) __MINGW_ATTRIB_PURE;
_CRTIMP void * __cdecl memcpy ( void * , const void * , size_t);
_CRTIMP void * __cdecl memmove ( void * , const void * , size_t);
_CRTIMP void * __cdecl memset ( void * , int , size_t);
_CRTIMP char * __cdecl strcat ( char * , const char * );
_CRTIMP char * __cdecl strchr ( const char * , int ) __MINGW_ATTRIB_PURE;
_CRTIMP int __cdecl strcmp ( const char * , const char * ) __MINGW_ATTRIB_PURE;
_CRTIMP int __cdecl strcoll ( const char * , const char * ); /* Compare using locale */
_CRTIMP char * __cdecl strcpy ( char * , const char * );
_CRTIMP size_t __cdecl strcspn ( const char * , const char * ) __MINGW_ATTRIB_PURE;
_CRTIMP char * __cdecl strerror ( int ); /* NOTE: NOT an old name wrapper. */
_CRTIMP size_t __cdecl strlen ( const char * ) __MINGW_ATTRIB_PURE;
...
}
其中extern "C"的作用是:
为了方便C++编译器兼容C程序,因为有些函数是用c编译器编译出来的,如果想让这些函数能在c++程序中使用,则需要告诉c++编译器。使用extern"c"就是这个目的,只要使用到c源文件中的函数、变量等,都要用extern"c"告知。