图中给出了三种输入字符串的方式
方式一:使用printf
函数,通过%c
格式符逐个输出str
数组中的字符,即 "hello"
。这里的%c
用于输出单个字符,所以需要依次列出要输出的字符。较麻烦
方式二:使用for
循环来输出字符串。循环条件是str[i]!= '\0'
,即当遇到字符串结束标志时停止循环。在循环体中,每次使用%c
格式符输出str[i]
,也就是逐个输出字符串中的字符,直到遇到结束标志。更为简便
这是三种不同的字符串初始化方式,
第二种和第三种会自动在末尾添加'\0',字符大小都为6
图中给出了两种不同的字符串输出函数,分别是puts和printf;
puts
函数的特点是在输出字符串后会自动添加一个换行符\n
,所以即使这里没有显式添加换行符,输出结果也会换行;
printf
函数不会像puts
函数那样自动换行,除非手动添加换行符。
gets
函数的特点是遇到换行符\n
才会停止接收输入,在此之前,即使遇到空格也不会停止,会一直接收直到用户按下回车键;
scanf
函数在接收字符串时,遇到空格、制表符或换行符就会停止接收,所以它不能接收包含空格的字符串;
由于
str
数组的类型是char
,每个元素占 1 个字节,所以sizeof(str)
得到的是整个数组的元素个数(这里是 32)。
使用strlen
函数需要包含string.h
头文件。对于字符串"hello world"
,其长度为 11(包含空格)。
- 第 76 行:使用
strcpy
函数将字符串"hello world"
(包含空格和一个'\0'
,共 12 个字节)复制到str
数组中。strcpy
函数会将源字符串(这里是"hello world"
)完整地复制到目标数组(这里是str
)中,包括字符串结束标志'\0'
。 - 第 77 行:再次使用
strcpy
函数,将str
数组中的字符串复制到dst
数组中。这样,dst
数组也将包含与str
数组相同的字符串内容。
- 第 86 行:使用
strcat
函数将str2
连接到str1
的末尾。strcat
函数会将源字符串(这里是str2
)连接到目标字符串(这里是str1
)的后面,并且会自动覆盖目标字符串末尾的'\0'
,然后在新的末尾添加'\0'
。连接后str1
的内容变为"hello world"
。 - 第 87 行:再次使用
strcat
函数,将字符串"!"
连接到str1
的末尾。此时str1
的内容变为"hello world!"
。
第 96 行:使用
strcmp
函数比较str1
和字符串"hello"
。strcmp
函数会按字典顺序比较两个字符串,若两个字符串相等,则返回 0;若第一个字符串大于第二个字符串,则返回一个正整数;若第一个字符串小于第二个字符串,则返回一个负整数。这里str1
为"hello world"
,与"hello"
不相等,且"hello world"
大于"hello"
,所以ret
的值为一个正整数。
第 99 行:使用strcmp
函数比较str1
和str2
。str1
为"hello world"
,str2
为"hel"
,"hello world"
大于"hel"
,所以ret
的值为一个正整数。
第 102 - 109 行:使用if - else
语句判断strcmp(str1, "hello")
的结果是否为 0。如果为 0,说明str1
和"hello"
相同,输出"和hello相同\n"
;否则,输出"和hello不相同\n"
。由于str1
为"hello world"
,与"hello"
不相同,所以会输出"和hello不相同\n"
。
第 117 行:使用
strcpy
函数将字符串"hello world"
复制到str
数组中。strcpy
会将源字符串完整地复制到目标数组中,包括字符串结束标志'\0'
。
第 118 行:使用strncpy
函数将字符串"hello world"
复制到str
数组中,但只复制sizeof(str) - 1
个字符。strncpy
用于指定复制的字符数量,这里减去 1 是为了留出一个位置给字符串结束标志'\0'
,避免数组越界。
第 119 行:使用strncat
函数将字符串"hello world"
连接到str
数组的末尾,但只连接sizeof(str) - strlen(str) - 1
个字符。strncat
用于指定连接的字符数量,这里先计算出str
数组剩余的空间(sizeof(str)
减去当前字符串长度strlen(str)
再减去 1),然后进行连接操作,同样是为了留出空间给'\0'
。
第 121 - 128 行:使用strncmp
函数比较str
数组中的字符串和"hello world"
,比较的字符数量为strlen(str)
。strncmp
用于比较指定数量的字符,这里根据str
数组中实际字符串的长度进行比较。如果比较结果为 0,说明两个字符串相同,输出"相同\n"
;否则,输出"不相同\n"
。
第 144 - 148 行:通过一个
for
循环来实现字符串的倒置。循环条件是i < len / 2
,这是因为只需要交换字符串前半部分和后半部分的字符即可实现倒置。例如,对于长度为 11 的字符串"hello world"
,只需要交换前 5 个字符和后 5 个字符。
在循环体中,首先将str[i]
的值存储到tmp
中,然后将str[len - i - 1]
的值赋给str[i]
,最后将tmp
的值赋给str[len - i - 1]
,从而实现了两个位置字符的交换。例如,当i = 0
时,len - i - 1 = 11 - 0 - 1 = 10
,就将str[0]
(第一个字符h
)和str[10]
(最后一个字符d
)进行了交换。
第 159 - 162 行:通过一个
while
循环来统计字符串的长度。循环条件是str[i]!= '\0'
,即当遇到字符串结束标志'\0'
时停止循环。在循环体中,每次将cnt
加 1,并将i
加 1,从而遍历整个字符串,统计字符个数(不包括'\0'
)。
例如,如果用户输入字符串"hello world"
,那么cnt
的值将为 11(因为"hello world"
包含 11 个字符,不包括'\0'
),输出结果为cnt = 11
。
这段代码的主要功能是统计用户输入字符串的长度(不包括字符串结束标志'\0'
)并输出。