第四章字符串和格式化输入or输出

本文详细介绍了C语言中的字符串和格式化输入/输出,讲解了字符数组、null字符、strlen()函数、常量和C预处理器、printf()与scanf()的使用,包括转换说明修饰符、*修饰符等关键概念,还提供了编程练习和复习题以巩固理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


title: 第四章 字符串和格式化输入/输出
author: HardyDragon
tags: C Notes


第四章 字符串和格式化输入/输出

4.1 前导程序

4.2 字符串简介

4.2.1 char类型数组和null字符

4.2.2 使用字符串

4.2.3 strlen()函数

4.3 常量和C预处理器

4.3.1 const限定符

4.3.2 明示常量

4.4 printf()和scanf()

4.4.1 printf() 函数

4.4.2 使用printf()

4.4.3 printf() 的转换说明修饰符

4.4.4 转换说明修饰符

4.4.5 使用scanf()

4.4.6 printf()和scanf()的*修饰符

4.4.7 printf()的用法提示

4.5 关键概念

4.6 本章小结

4.7 复习题

4.8 编程练习


4.1 前导程序

/* talkback.c -- 演示和用户交互*/
#include <stdio.h>
#include <string.h>
#define DENSITY 62.4
int main(int argc, char const *argv[])
{
    /* code */
    float weight, volume;
    int size, letters;
    char name[40];

    printf("HI,what's your first name?\n");
    scanf("%s", name);
    printf("%s,what's your weight in pounds?\n", name);
    scanf("%f", &weight);
    size = sizeof name;
    letters = strlen(name);
    volume = weight / DENSITY;
    printf("Well, %s ,your volume is %2.2f cubic feet.\n", name, volume);
    printf("Also,your first name has %d letters,\n", letters);
    printf("and we have %d bytes to store it.\n", size);
    getchar();
    getchar();
    return 0;
}

result

HI,what's your first name?
Chen
Chen,what's your weight in pounds?
130
Well, Chen ,your volume is 2.08 cubic feet.
Also,your first name has 4 letters,
and we have 40 bytes to store it.
  • 使用数组存储字符串,用户输入的名被存储在字符数组中,这个数组占用内存中连续的40个字节,每个字节存储一个字符值。
  • 使用%s转换说明来处理字符串的输入和输出。注意,在scanf()中,name没有&前缀,而weight有(&weight和name都是地址)
  • strlen()获取字符串长度

4.2 字符串简介

字符串是一个或多个字符的序列,双引号不是字符串的一部分,双引号只是告诉编译器它括起来的是字符串。

  • char类型数组和null字符

    C语言没有专门存储字符串的变量类型,字符串都被存储在char类型的数组中。数组由连续的存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符。

    image-20201019085537825

    数组末尾的字符 ‘\0’ ,这是空字符,C语言用它来标记字符串的结束。空字符不是数字0,它是非打印字符,但是它的ASCII码为0。C中的字符串一定要以空字符结束,意味着数组的容量如要正常使用就需要比待存储的字符数多1,所以 程序中的 name[40] 数组只能存储39个字符,剩下一个字节留给空字符。

    再次明确一下数组的概念,数组可以看做一行连续的多个存储单元,数组是同类型数据元素的有序序列。以下声明创建一个包含40个存储单元的数组,每个单元存储一个char类型的值。

    char name[40];

    name后面的方括号【】表明这是一个数组,方括号中的40表明该数组中的元素数量。char 表示每个元素的类型。记得在字符串的末尾加上一个 ‘\0’ 。

  • 使用字符串

    // praise1.c -- 使用不同类型的字符串
    #include <stdio.h>
    #define PRAISE "You are an extraodinary being"
    int main(int argc, char const *argv[])
    {
         
        char name[40];
        printf("What's your name?");
        scanf("%s", name);
        printf("Hello,%s.%s\n", name, PRAISE);
        getchar();
        getchar();
    
        return 0;
    }
    
    

    result:

    What's your name?Hardy
    Hello,Hardy.You are an extraodinary being
    ------------------------------------------
    What's your name?Hardy Dragon
    Hello,Hardy.You are an extraodinary being
    

    %s告诉printf() 打印一个字符串。一个字符串存储在name数组中,另一个有 PRAISE 表示。

    我们可以不用把空字符放入字符串末尾,因为scanf() 在读取输入时就已经完成了这项工作。同样也不用在字符串常量 PRAISE 末尾添加空字符,编译器会自动帮忙在末尾加上空字符。

    注意:scanf()函数只是读取了 Hardy Dragon 中的Hardy,它在遇到第一个空白(空格、制表符或换行符)时就不再读取键盘的输入了。根据%s的转换说明,scanf() 只会读取字符串的一个单词,而不是一整句。C语言当然还有其他的输入函数用于处理各种输入情况例如 fgets() 用于读取一般字符串。

    字符串和字符:

    字符串常量"x" 和 ‘字符常量 x’ 的不同在于字符常量 ‘x’ 是基本类型,而字符串常量"x" 是派生类型;其实字符串常量"x" 是由两个字符常量组成的,‘x’ 和 ‘\0’

  • strlen() 函数

    之前用到了 sizeof 运算符,它以字节为单位给出对象大小。strlen() 函数给出字符串中的字符长度。因为1字节存储一个字符,所以sizeof() 和strlen() 对于字符串的效果是一样的么?

    // praise2.c 
    #include<stdio.h>
    #include<string.h>
    #define PRAISE "You are an extraodinary being"
    int main(int argc, char const *argv[])
    {
         
        char name[40];
    
        printf("What's your name?");
        scanf("%s", name);
        printf("Hello,%s.%s\n", name, PRAISE);
        printf("Your name of %zd letters occupies %zd memory cells.\n",
        strlen(name),sizeof name)
### 关于uView 1.x 版本中的视频上传功能 在uView 1.x版本中,实现视频上传主要依赖`uni.chooseVideo` API来选取本地视频文件并获取其临时路径。之后利用`uni.uploadFile`接口完成向服务器传输的过程[^1]。 对于具体操作而言,在前端页面定义按钮触发选择视频动作: ```html <template> <view class="content"> <!-- 添加一个用于点击选择视频的按钮 --> <button type="primary" @click="chooseVid">选择视频</button> <!-- 显示已选视频缩略图以及名称等信息 --> <video v-if="localSrc !== ''" :src="localSrc"></video> <!-- 提交表单按钮 --> <button type="warn" @click="submitForm">提交</button> </view> </template> ``` 接着是在Vue实例内部编写逻辑处理函数: ```javascript <script> export default { data() { return { localSrc: '', // 存储所选视频的临时地址 } }, methods: { chooseVid() { uni.chooseVideo({ sourceType: ['album'], // 可设置为['camera']仅限拍摄;默认两者都有 maxDuration: 60, // 录制最长时间限制(秒) camera: 'back', // 使用前置还是后置摄像头,默认后置 success:(res)=>{ this.localSrc=res.tempFilePath; } }); }, submitForm(){ const uploadTask=uni.uploadFile({ url:'https://example.com/upload',// 替换成实际接收上传请求的服务端API URL filePath:this.localSrc, name:'file', formData:{'user':'test'},// 额外携带的数据 success(uploadRes){ console.log('Upload Success:',JSON.parse(uploadRes.data)); }, fail(err){ console.error('Failed to Upload Video:',err); } }); // 监听进度变化事件可选 uploadTask.onProgressUpdate((progressRes) => { console.log(`上传进度${progressRes.progress}%, 已经上传${progressRes.totalBytesSent}, 总大小${progressRes.totalBytesExpectedToSend}`); }); } } } </script> ``` 此段代码展示了如何基于uView框架构建简易界面让用户挑选想要上传的视频片段,并将其发送至指定位置保存起来。需要注意的是服务端需做好相应的解析工作以便正确接收到客户端传递过来的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值