了解和使用字符串(二)

139 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

接上一篇来说使用字符串详细内容

举一个简单例子

#include <stdio.h>
#define PRAISE "You are an extraordinary being"
int main(void) {
char name[50];
printf("What's your name? ");
scanf ("%s",name );
printf("Hello,%s.%s.\n",name,PRAISE);
return 0;
   }

运行结果

%s告诉printf()打印一个字符串,%s出现了两次,因为程序要打印2个字符串:一个存储在name数组中;一个由PRAISE来表示。打印结果如下:

Snipaste_2022-08-04_10-36-59.png

大家不用亲自把空字符放入字符串末尾,scanf()在读取输入时就已经完成了这项工作。也不用在字符串常量PRAISE末尾添加空字符。PRAISE后面用双引号括起来的文本是一个字符串,编译器在末尾加空字符。

注意:scanf()只读取了Nicole Plains中的Nicole,它在遇到第一个空白时不在读取输入。因此,scanf()在读取Nicole和Plains之间的空格时就停止了。一般而言,根据%s转换说明,scanf()只会读取字符串中的一个单词,而不是一整句。

strlen()函数

strlen()函数用于给出字符串的长度。sizeof()它以字节为单位给出对象的大小。因为一个字节储存一个字符,大家可能认为两种方法应用于字符串相同,我们可以对上面例子进行改动来验证。

对前面案例进行改动

#include <stdio.h>
#include<string.h>
#define PRAISE "You are an extraordinary being"
int main(void) {
char name[50];
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);
printf("The phrase of praise has %zd letters",strlen(PRAISE));
printf("  and occupies %zd memory cells.\n",sizeof PRAISE);
    return 0;
    }

结果展示

Snipaste_2022-08-04_11-05-53.png

打印的最后一句话letterand运行的时候忘空格了,大家运行的时候注意一下!程序已改正。

说明

可以看到新增的头文件string.h,该头文件包含很多字符相关的函数原型,包括strlen()。

C把函数库中相关函数归为一类,并为提供一个头文件。例如,printf()和scanf()属于stdio.h头文件。

可以看到使用了两种方法处理很长的printf()语句。

  • 将printf()语句分为两行
  • 使用两个printf()语句打印一行内容,只在第二条printf()语句中使用换行符(\n)。

sizeof运算符报告,name数组有50个存储单元。目前只有6个单元来存储Plains,所以strlen()得出结果是6。name数组的第12个单元存储空字符,strlen()并未计入。

对于PRAISE,用strlen()得出的字符串中的字符数。然而,sizeof运算符给出更大的空间,它需要把空字符也计算在内。