【C语言】字符数组与scanf读取字符串

发布时间 2024-01-07 00:27:29作者: hzyuan

C语言中不提供字符串类型,用字符数组来存储字符串。

字符数组

//定义并初始化字符数组
//char c[10] = {'h','e','l','l','o'};
//更方便的方式:
char c[10] = "hello"; //注意c[5]中存储的是'\0'

C语言规定字符串的结束标志为 '\0',系统会对字符串常量自动加一个'\0'。
为了保证处理方法一致,字符数组中也要添加 '\0',所以字符数组存储的字符串长度必须字符数组少一个字节,该字节用来存储 '\0'。

#include <stdio.h>

int main() {
//    char c[6] = "hello";
    char c[5] = "hello";
    printf("%s\n",c);
    return 0;
}

上述代码的执行结果:

图1-1
为什么会打印出乱码?这是因为 printf 通过 %s 打印字符串时是依次输出每个字符,当读到结束符 '\0'时才结束打印。通过内存视图(图1-2)我们可以看到由于字符数组c长度为5,并没有多余的空间存储 '\0',所以printf 读完数组c后还会继续向后读取,直到读到 '\0'。

图1-2

scanf 读取字符串

#include <stdio.h>

int main() {
    char c[10]="123456789";
    scanf("%s",c); //字符数组名c中存储了数组的起始地址,因此不需要取地址
    printf("%s\n",c);
    return 0;
}

执行结果:

图2-1
scanf遇到空格会停止读取,stdin中会剩下" world"。

图2-2
如图2-2所示,scanf会在读取完字符串后自动添加一个 '\0'。

scanf 在使用 %s 读取字符串时会忽略空格和回车。

#include <stdio.h>

int main() {
    char c[10],d[10];
    scanf("%s%s",c,d);
    printf("c=%s,d=%s",c,d);
    return 0;
}

执行结果: