C Primer Plus学习笔记,第四章

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

C存储字符串的方式之一是使用字符数组char a[]

注意,每一个字符占据一个比特,且在这个字符数组中,其末尾一定是\0,\0是一个非打印字符,C在打印到\0时会停止打印

#include<stdio.h>

int main(void)
{
    char a[] = {'a','b','b','\0','v','d'};
    printf("%s",a);
    return 0;
}
/* outputs:
abb
*/

可以从示例中看到\0后面的字符不再被打印。

并且scanf在读取字符串的时候读到空格‘ ’,就会停止。

#include<stdio.h>

int main(void)
{
    char a[20];
    scanf("%s",a);
    printf("%s",a);
    return 0;
}
/*
input: hoiwdh nwdiw
output: hoiwdh
*/

C在limits.h 和floats.h中有一些符号常量,用于告诉用户,该整型和浮点数的大小限制(位数,字节数等)。详情见C Primer Plus 67页

C的参数传递机制:
#include<stdio.h>
int main(void)
{
    float n1 = 3.0f;
    double n2 = 3.0;
    long n3 = 2000000000;
    long n4 = 1234567890;
    printf("%ld,%ld,%ld,%ld",n1,n2,n3,n4);
}
n1n2n3n4
4 bytes8 bytes8bytes8bytes

运行上面那段函数的时候,会先把n1,n2,n3,n4按照顺序存入栈中,然后再运行printf,之后按照%ld给定的方式去解析栈中的内存信息(编译器不同结果似乎也不同),我的编译器是有纠错功能的。

注意:printf()函数也是有返回值的,它的返回值时这一次输出的字符串的总长度,包括诸如\n\b(空格)之类的一些特殊字符;

以及你在代码中按下的enter并不能被编译器理解为\n

#include<stdio.h>
int main(void)
{
    int a = 1;
    printf("%d This way is true\n",
           a);
    printf("%d This way is true\
yes",2);
    printf("%d This way is true"
          "Yes",3);
    printf("%d This way is false
           ",a);
       
}

最后一个会导致编译错误:missing terminating ‘"’ character [-Winvalid-pp-token]

且在2中下一行的元素不可以带有缩进,否则会在输出中带上这个缩进

scanf()解析:

e.g1

#include<stdio.h>
int main(void) {
    int b,c,d;
    char a;
    scanf("%c %d %d",&a,&b,&c);
    printf("%d,%d,%d",a,b,c);
    scanf("%d",&d);
    printf("\n%d",d);
}
input{
11111 2 3}
outputs{
49,1111,2
3}

首先scanf会读取你的输入并且最开始先跳过你输入的全部的空白字符如\n,\b。然后会一旦读取到一个非字符时,按照此时%c的要求,读到这里就停止。并把值存入a所在的地址,然后把自己已经保存好的输入从缓冲区中删去。然后重复上述步骤。

注意到此时b = 1111,c = 2,因为在写入b的值的时候只写了是从上一次读到的1开始,往后读取,连续读取4个1,然后遇到空格,停止。把1111存入b,并且在缓冲区中删去1111,现在缓冲区中有:{\b2\b3\n},然后照例,跳过空格,读取2,然后遇到空格,停止读取,保存2至c,同时缓冲区把{\b2}清楚,所以此时缓冲区里面还留下3。之后进入下一轮的输入的时候,由于缓冲区中还有字符,所以程序认定你已经输入完毕,然后读取了3,传给d。

之所以a的值是49是因为,按照ansii 码,a的ascii码为49,

e.g2

#include<stdio.h>
int main(void) {
    int b, c;
    scanf("%d,%d", &c, &b);
    printf("%d %d", c, b);
}
input: 1,2
output:1 2
input:1 2
output:1 1

按照scanf("%d,%d",&c,&b)的要求,scanf要读取到 整数逗号整数 这样的一个格式,在第二个I/O里面,输入是{1 2},1和2之间是空格,而不是逗号,格式匹配错误,C在此时停止读取输入。并且下一步中所输出的那个b的值随机,看当时内存的情况。

e.g3

#include<stdio.h>
int main(void) {
    int  a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16;
    scanf("%d%d%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a11,&a13,&a14);
    printf("%d %d %d %d %d %d %d %d\n",a1,a2,a3,a4,a5,a11,a13,a14);
    fflush(stdin);
    scanf("%d%d%d%d%d%d%d%d",&a6,&a7,&a8,&a9,&a10,&a12,&a15,&a16);
    printf("%d %d %d %d %d %d %d %d\n",a6,a7,a8,a9,a10,a12,a15,a16);
}

input:a
output:1 71188576 1 69844412 -312147967 1 1 70844528
input:a
output:70495036 1 1807120320 1 71188576 69844412 0 0

可以看出是随机的。

以及如果是要转化为%c的时候\b(空格)也会被当成值符给,解决放啊是" %c"在%c前面加一个空格,那么scanf就会不断的忽略这个空格,不把空格符传给对应的字符变量,但是如果把空格替换为其他的字符,那么scanf只会忽略一次。比如scanf(“12%c”,&n),然后输入123,那么你还是n会被赋值为3

修饰符*

e.g.1: 在printf()

#include<stdio.h>
int main(void) {
    double b = 383123123129.39122332430293203902903;
    printf("The b = %0*.*f",100,5,b);
    return 0;
}
outputs: 
The b = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001.39122

第一个*被替换为100,第二个*被替换为5,在这里%0*.*f实际上就是%0100.5f

e.g2

#include<stdio.h>
int main(void) {
    int n;
    printf("Inputs: ");
    scanf("%*d %*d %d",&n);
    printf("Outputs: %d",n);
}
/*
Inputs: 121 343 656565
Outputs: 656565
*/

前两个符合要求的输入会被scanf一并略过,这样子可以帮助你在获取格式确定的一个文件时获取某一部分的元素(通过省略其它部分的元素)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 第七章主要介绍了C语言中的函数,包括函数的定义、调用、参数传递、返回值等方面的内容。具体内容包括: 1. 函数的定义和调用:介绍了如何定义函数以及如何调用函数,包括函数的返回类型、函数名、参数列表和函数体等。 2. 函数的参数传递:介绍了C语言中的参数传递方式,包括值传递和地址传递,以及如何在函数中使用参数。 3. 函数的返回值:介绍了函数的返回值类型和返回值的作用,以及如何在函数中使用返回值。 4. 函数的声明和定义:介绍了函数的声明和定义的区别,以及如何在不同的文件中使用函数。 5. 函数的递归:介绍了递归函数的概念和使用方法,以及递归函数的优缺点。 6. 函数指针:介绍了函数指针的概念和使用方法,以及如何在程序中使用函数指针。 总的来说,第七章是C语言中非常重要的一章,对于理解和使用函数有很大的帮助。 ### 回答2: 《C Primer Plus》第六版第七章主要介绍了C语言中的输入和输出函数。这章的内容包括标准I/O库、`printf()`、`scanf()`等函数以及文件输入输出等。 在这一章中,首先讲解了如何使用标准I/O库进行输入输出。标准I/O库提供了一组函数,可以用于从键盘读取输入,或将结果输出到屏幕上。`printf()`函数可以用于格式化输出,可以控制输出的格式,比如输出特定长度的整数、浮点数等。`scanf()`函数可以用于从键盘读取输入,并将其存储到变量中,也可以使用特定的格式来读取特定类型的数据。 接下来,讲解了如何使用`getchar()`和`putchar()`函数。`getchar()`函数用于从键盘读取单个字符,`putchar()`函数用于向屏幕输出单个字符。 此外,还介绍了文件的输入输出。通过使用`fopen()`函数打开文件,可以读取或写入文件的内容。使用`fprintf()`函数可以将数据写入文件中,使用`fscanf()`函数可以从文件中读取数据并存储到变量中。同时还介绍了如何使用`fclose()`函数关闭文件。 最后,本章还讲解了格式化输出的一些高级特性,比如控制字段宽度、对齐方式以及使用转换说明符等。 通过学习《C Primer Plus》第六版第七章,我们能够了解C语言中输入输出的基本概念和原理,掌握使用输入输出库函数进行读写操作的方法,以及如何进行文件的读写操作。这对于日后编写C语言程序以及处理文件输入输出都有着重要的作用。 ### 回答3: C Primer Plus第六版第七章主要介绍了C语言中的函数。函数是一段完成特定任务的可重复使用的代码块,它可以接收输入参数并返回一个值。 在这一章中,我们学习了如何定义函数并明确函数的返回类型、函数名和参数列表。通过使用函数,我们可以将程序中的代码划分为更小、更可管理的部分。函数的主要好处之一是提高了代码的可读性和可维护性。 我们还学习了传递参数的不同方式,包括按值传递、按地址传递以及传递指针。这些方法允许我们在函数之间传递数据,并在函数内部对数据进行修改。 此外,我们还研究了递归函数的概念。递归函数是指可以调用自身的函数。使用递归可以通过将问题划分为更小的子问题来解决复杂的问题。 在这一章中,我们还学习了函数的作用域和生命周期。函数的作用域定义了函数内部和外部变量的可见性。函数的生命周期指的是函数在程序运行期间的保持状态的时间。 最后,我们还讨论了函数的多文件组织和调用。通过将函数定义和函数声明分离到不同的文件中,我们可以更好地组织和管理大型项目的代码。 通过学习C Primer Plus第六版第七章,我们可以更好地理解和应用函数在C语言中的重要性。掌握函数的知识将有助于我们编写更模块化、可读性更强、可维护性更高的代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值