C语言学习(四)

char类型数组

字符串,由一个或多个字符组成的序列就做字符串。双引号不是字符串的一部分,只是告诉双引号里的内容是字符串,C语言中没有专门储存字符串的变量类型,字符串都被存储在char类型的数组中。数组由连续的储存单元组成,可以把数组看作是一行连续的多个存在的存储单元,数组是同类型数据元素的有序序列。数组末尾位置的字符\0,这是空字符,C语言用它标记字符的结束,不是数字0,为非打印字符,其ascii码值为0

I am a I 储存

I

a

m

I

\0

每个单元存储一个字节 标记字符的结束

char a 分1个字节 char a[5] 分5个字节

使用字符串

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define a "aaa"
int main(void) {
    char name[20];
    printf("what's your name?\n");
    scanf("%s",name);
    printf("hello,  %s %s\n",name,a);
    return 0;
}

将scanf换成scanf_s会出现打印不出来

#define用这样一句话定义了一个字符常量,不需要在字符串末尾加上\0,也就是空字符,编译器会默认加上。scanf函数只读取了1 1中的第一个1,在遇到空白(空格,制表符或换行符)就停止读取,%s转换说明是打印字符串的,scanf函数值会读取字符串中的第一个单词,而不是整句话。

strlen()函数

一般而言,C把函数库的相关函数归为一类,并为每类函数提供一个头文件。

strlen函数给出了字符串中的字符长度,sizeof函数是以字节为单位给出对象的大小

string.h头文件包含了多个与字符相关的符号,包括strlen函数,%zd的转换说明用来打印sizeof和strlen。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define a "aaa"

int main(void) {
    char name[40];
    int b;
    printf("what's your name?\n");
    scanf("%s",name);
    printf("%s %s\n",name,a);
    printf("%zd 55 %zd\n", sizeof(name), strlen(name));
    printf("%zd 55 %zd\n", sizeof(a), strlen(a));
    return 0;
}

sizeof和strlen函数输出的结果不一样

对于常量a来说,strlen函数得出的也是字符串中的字符数(包括空格和标点函数),sizeof把末尾的不可见的空字符也计算在内了

sizeof函数可以不用括号,sizeof 22,使用圆括号时取决于运算对象是类型还是特定量(有值或无值的变量)。运算对象时时类型(变量类型,int,float,char)时,圆括号不能少,如sizeof(float);时特定量时,可有可无,一般建议使用圆括号。

printf修饰符

- 左对齐,从左侧开始打印
+ 有符号值,为正加+,为负加-
空格 有符号值为正,加前导空格,为负加前导-
# 把结果转换成另一种形式
0 0代替空格填充字符宽度

转换说明不匹配会造成数据读取出错,参数传递机制,如下

printf("%ld %ld %ld\n",n1,n2,n3)

该调用告诉计算机把变量n1,n2,n3的值传递给程序。这是一种常见的参数传递方式。计算机根据变量类型把这些值放到栈中。程序把传入的值放入被称为栈的内存区域。printf根据转换说明从栈中读取值。当转换说明不匹配时,会造成读取数据不是赋值的值

打印较长的字符串

3种方法 使用多种printf语句

使用\和enter键组合换行

ANSI C 引入的字符串连接

使用scanf()

读取数据时两种情况 ,需要加&(读取变量),不需要加&(字符串数组)

scanf空白字符,使用%s读取一个单词时,无法利用字符宽度读取多个单词,使用字符宽度时,读到字段末尾,或第一个空白字符就停止读取

posted @ 2023-04-20 10:09  mushangqiujin  阅读(0)  评论(0编辑  收藏  举报  来源