C语言字串长度、复制、串接

在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

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值