C语言升级历程——字符串和字符数组

本文详细介绍了C语言中字符串和字符数组的区别,以及常用的字符串输入输出函数如scanf(),gets(),fgets(),puts(),fputs()和strlen()的用法,还涉及了字符串追加的示例。
摘要由CSDN通过智能技术生成
1、字符串和字符数组的区别
  • C语言中没有字符串这种数据类型,可以通过char类型的数组来替代
  • 字符串一定是一个char的数组,但char的数组未必是字符串
  • 数字0(和字符 '\0' 等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那就不是一个字符串,只是普通的字符数组
#include <stdio.h>

int main(){

    //普通的字符数组
    char c1[] = { 'a', 'p', 'p', 'l', 'e'};
    printf("c1= %s\n",c1);//乱码,因为没有'\0'结束符

    //以'\0'('\0'就是数字0)结尾的字符数组是字符串
    char c2[] = { 'a', 'p', 'p', 'l', 'e'};
    printf("c2= %s\n",c2);//打印出apple

    //字符串的处理以'\0'(数字0)作为结束符,后面的'w','o','r','l','d'不会输出
    char c3[] = { 'h', 'e', 'l', 'l', 'o', '\0', 'w', 'o'. 'r', 'l', 'd', '\0'}
    printf("c3= %s\n",c3);

    return 0;
}
2、字符串的输入输出函数

我们之前学的有scanf();函数,可以通过%s来输入字符串。

#include <stdio.h>

int main(){

    char str[100];

    printf("input string1: \n");
    scanf("%s",str);//默认以空格分隔
    printf("output: %s\n",str);

    return 0;
}

接下来介绍几个其他的字符串输入输出函数

1)、gets()
函数char  *gets(char *s)
头文件#include <stdio.h>
参数s:字符串首地址
返回值

成功:读入的字符串

失败:NULL

功能从标准输入读入字符,并保存到s指定的内存空间,知道出现换行符或读到文件结尾为止

gets(str)和scanf("%s",str)的区别

  • gets(str)允许输入的字符串有空格
  • scanf("%s",str)不允许含有空格,接收到空格代表停止接收

注意:由于scanf()和gets()无法知道字符串s大小,必须遇到换行符或读到文件结尾为止才接收输入,所以容易导致字符数组越界(缓冲区溢出)的情况。

#include <stdio.h>

int main(){

    char str[100];

    printf("请输入str: ");
    gets(str);
    printf("str= %s\n",str);

    return 0;
}

2)、fgets()
函数char  *fgets(char *s, int size, FILE *stream)
头文件#include <stdio.h>
参数

s:字符串

size:指定最大读取字符串的长度(size - 1)

stream:文件指针,如果读取键盘输入的字符串,固定写stdin

返回值

成功:成功读取的字符串

读到文件尾或出错:NULL

功能从stream指定的文件内读入字符,保存到 s 所指定的内存空间,直到出现换行字符、读到文件结尾或者是已经读了size - 1个字符为止,最后会加上字符 '\0' 作为字符串结束

fgets()在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也作为字符串的一部分。通过scanf()和gets()输入一个字符串的时候,不包含结尾的“\n”,但通过fgets()结尾多了“\n”。

fgets()函数是安全的,不存在缓冲区溢出的问题。

#include <stdio.h>

int main(){

    char str[100];

    printf("请输入str:");
    fgets(str,sizeof(str),stdin);
    printf("str=\"%s\"\n",str);

    return 0;
}

3)、puts()
函数int puts(const char *s);
头文件#include <stdio.h>
参数s:字符串首地址
返回值

成功:非负数

失败:-1

功能标准设备输出s字符串,在输出完成后自动输出一个'\n'
#include <stdio.h>

int main(){

    printf("Hello World");//输出之后不会换行
    puts("Hello World");//输出直接自己加一个\n自动换行

    return 0;
}

4)、fputs()
函数int fputs(const char *str, FILE *stream)
头文件#include <stdio.h>
参数

str:字符串

stream:文件指针,如果把字符串输出到屏幕,固定写stdout

返回值

成功:0

失败:-1

功能将str所指定的字符串写入到stream指定的文件中,字符串结束符'\0' 不写入文件

fputs()是puts()的文件操作版本,但fputs()不会自动输出一个'\n'

#include <stdio.h>

int main(){

    printf("Hello World");//输出Hello World,不会自动换行
    puts("Hello World");//输出Hello World之后自动换行
    fputs("Hello World",stdout);//输出Hello World之后不会自动换行

    return 0;
}

3、求字符串长度函数
strlen()
函数size_t strlen(const char *s);
头文件#include <string.h>
参数s:字符串首地址
返回值字符串 s 的长度,size_t为unsigned int类型
功能计算指定字符串s的长度,不包含字符串结束符’\0‘
#include <stdio.h>
#include <string.h>

int main(){

    char str[] = "abc\0defg";
    int n = strlen(str);
    printf("n = %d\n",n);//输出3.字符串中有结束标志\0

    return 0;
}

4、练习:字符串的追加
#include <stdio.h>

int main(){

    char str1[] = "abcdefg";
    char str2[] = "123456";
    char dest[100];

    int i = 0;
    while(str1[i] != 0){
        dest[i] = str1[i];
        i++;
    }
    
    int j = 0;
    while(str2[j] != 0){
        dest[i + j] = str2[j];
        j++;
    }
    dest[i + j] = 0;//添加字符串结束标志

    printf("dest = %s\n",dest);

    return 0;
}

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值