字符串长度、复制、连接


在〈字符数组与字符串〉谈过,在 C 语言中,字符串是一个字符数组,最后一个字符以空字符'\0'作结尾,若要得知字符串所含字符长度(不包括空字符),则可以使用strlen函数:

size_t strlen( const char *str );

参数类型const char*表示,这边接受一个字符串,这在之后会谈到为什么字符串是这个类型;size_tunsigned类型,在大部份系统是定义为unsigned int,但在 64 位系统中可以是unsigned longstrlen会返回字符数组中第一个字符至空字符的长度值减 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 制定,只能用于修饰指针的关键字,之后会谈到,就这边来说,表示你得保证destsrc是不同来源的实参。

第一个参数是目的字符数组,第二个参数是来源字符串,strncpy第三个参数则是要复制的字符长度,要注意的是,strncpy不会自动在目的数组加上空字符,它只是单纯的复制指定长度的字符,以下示范strcpystrncpy

#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




展开阅读全文