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

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;
}

执行结果:

图2-3

posted @   hzyuan  阅读(310)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示