在C 语言中,字串是一个字元阵列,最后一个字元以空字元'\0'
作结尾,若要得知字串所含字元长度(不包括空字元),则可以使用strlen
函式:
size_t strlen( const char *str );
参数型态const char*
表示,这边接受一个字串,这在之后会谈到为什么字串是这个型态;size_t
是unsigned
型态,在大部份系统是定义为unsigned int
,但在64 位元系统中可以是unsigned long
。strlen
会传回字元阵列中第一个字元至空字元的长度值减1:
#include <stdio.h>
#include <string.h>
int main(void) {
char buf[80];
puts("请输入字串...");
scanf("%s", buf);
size_t length = strlen(buf);
printf("字串长度:%lu\n", length);
return 0;
}
字串相关处理函式是定义在string.h 中,所以要将之#include
,执行结果如下:
请输入字串...
Justin
字串长度:6
如果使用fgets
的话,要注意它会包括最后按下Enter 的换行字元,你可以试着上例中的scanf
该行,换成以下:
fgets(buf, sizeof(buf) / sizeof(buf[0]), stdin);
你会发现,输入字串Justin 的话,会显示长度为7,这是因为包括了换行字元。
如果要进行字串复制,可以使用strcpy
函式,若要复制字串中若干字元内容,可以使用strncpy
:
char *strcpy( char *restrict dest, const char *restrict src );
char *strncpy( char *restrict dest, const char *restrict src, size_t count );
restrict
是C99 制定,只能用于修饰指标的关键字,之后会谈到,就这边来说,表示你得保证dest
与src
是不同来源的引数。
第一个参数是目的字元阵列,第二个参数是来源字串,strncpy
第三个参数则是要复制的字元长度,要注意的是,strncpy
不会自动在目的阵列加上空字元,它只是单纯的复制指定长度的字元,以下示范strcpy
与strncpy
:
#include <stdio.h>
#include <string.h>
#define LEN 80
int main(void) {
char buf[LEN];
puts("请输入名称...");
// fgets 会包括 enter 字元
fgets(buf, LEN, stdin);
int lenOfName1 = strlen(buf) + 1;
char name1[lenOfName1];
strcpy(name1, buf);
printf("名称:%s", name1);
// 不复制换行字元
int lenOfName2 = lenOfName1 - 1;
char name2[lenOfName2];
// 设定全部字元为空字元
memset(name2, '\0', lenOfName2);
strncpy(name2, buf, lenOfName2);
printf("名称:%s", name2);
return 0;
}
因为strncpy
不会自动在目的阵列加上空字元,在这个范例中,使用memset
函式将全部字元设为空字元,一个执行的范例如下所示:
请输入名称...
Justin Lin
名称:Justin Lin
名称:Justin Lin
若要串接两个字串,则要使用strcat
,若要串接部份字串,可以使用strncat
:
char *strcat( char *restrict dest, const char *restrict src );
char *strncat( char *restrict dest, const char *restrict src, size_t count );
第二个参数的字串会串接到第一个参数之后,因此第一个参数必须保留足够的空间作为串接时使用,以下范例示范这两个函式的使用:
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[] = "xyz";
char str2[] = "abc";
int len = strlen(str1) + strlen(str2) + 1;
char concated[len];
memset(concated, '\0', len);
strcat(concated, str1);
strcat(concated, str2);
printf("串接後:%s\n", concated);
return 0;
}
执行结果如下:
串接後:xyzabc