C++入门教程(五、数组与字符串)

35 篇文章 9 订阅

前面教程汇总

第一讲

C++入门教程(一、初步了解)

第二讲

C++入门教程(二、基本数据类型)

第三讲

C++入门教程(三、数组、注释与函数)

第四讲

C++入门教程(四、运算符与表达式)

数组

一维数组

之前讲过,这里不再赘述。参见:C++入门教程(三、数组、注释与函数)之数组

二维数组

二维数组定义的一般形式如下:

类型说明符 数组名[常量表达式1][常量表达式2]

与一维数组的定义唯一的不同是多了一个常量表达式2,其中,常量表达式1为第一维的长度,常量表达式2为第二维的长度。通常在处理二维数组的时候,为了便于理解,都将数组视为一个矩阵,常量表达式1表示矩阵的行数,而常量表达式2表示矩阵的列数。与一维数组一样,在定义二维数组时,常量表达式同样不能为变量。下面先通过一段代码来看二维数组的定义。

#include <iostream>
#include <cstdio>
#define M 4
#define N 3
using namespace std;

int main()
{
	int arr[M][N];
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			cout << arr[i][j];
		}
    	cout << endl;
	}
	return 0;
}

字符串

C++中的字符串

这个之前讲过,不再赘述。参见:C++入门教程(二、基本数据类型)之字符串

C语言中的字符串

注:为了方便,以下程序均用C语言表示(真正应用到C++中,可以把 stdio.h 写成 cstdio ,加上命名空间)。

字符串输入

如果想把一个字符串读取到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串,C库提供了三个读取字符串的函数:scanf()gets()fgets()

创建存储空间

可以通过数组( char name[10] )来分配存储空间,也可以通过C语言动态内存分配函数来动态分配存储空间。

char *name;
scanf("%s", name);

如果通过上面的代码来创建存储空间,可能会通过编译器,但是在读入 name 的时候,name 会覆盖程序中的数据和代码,并可能导致程序异常终止。这个是 因为 scanf() 把信息复制到由 name 指定的地址中,而在这种情况下,参数是个 未被初始化的指针,name 可能指向任何地方。

gets() 函数

gets()(get string)函数对于交互式程序非常方便,它从系统的标准输入设备(通常是键盘)获得一个字符串。因为字符串没有预定的长度,所以gets()函数通过判断遇到的第一个换行符 \n 结束输入,按回车键可以产生这个字符。它读取换行符之前(不包括换行符)的所有字符,并在这些字符后添加一个空字符 \0

[clef@rhel6164 c]$ cat test1.c
#include<stdio.h>
#define MAX 81

int main(void)
{
    char name[MAX];
    char *ptr; //指向char的指针

    printf("Please input your name.\n");
    ptr = gets(name); //使用一个地址吧字符串赋值给name
    //gets()函数使用return关键字返回字符串的地址
    printf("name, %s\n", name);
    printf("ptr, %s\n", ptr);

    return 0;
}

编译&运行:

[clef@rhel6164 c]$ gcc test1.c
/tmp/ccDJ9AHw.o: In function `main':
//因为gets()函数不检查存储区是否能够容纳实际输入的数据,可以用后面的fgets()函数替换gets()函数
test1.c:(.text+0x1a): warning: the `gets' function is dangerous and should not be used. 
[clef@rhel6164 c]$ ./a.outPlease input your name.clefname, clef 
//这里ptr和name的内容是一样的ptr, clef

如果在 gets() 函数在读取字符串时 出错或者遇到文件结尾,它就返回一个空(或0)地址,这个空地址被称为空指针,并且 stdio.h 里面定义的常量 NULL 来表示,可以用下面的代码来进行一些错误检测。

while(get(name) != NULL)

也可以通过 getchar 函数来完成上面的错误检测。

while((ch = getchar()) != EOF)

注意:空指针和空字符是不一样的,不要混淆。空指针是一个地址,而空字符是一个 char 类型的数据对象其值为0,数字上都可以用0表示,但是概念不同:NULL 是一个指针,而0是一个 char 类型的常量。

fgets() 函数

因为 gets() 函数不会检查存储区是否能够容纳实际输入的数据,多出来的字符简单地溢出到相邻的内存区,所以上面的代码在编译的时候会有 warningfgets() 函数和 gets() 函数的不同:

它需要第二个参数来说明最大读入字符数。如果这个参数值为n,fgets() 就会读取最多 n-1 个字符或者读完一个换行符为止(因为会自动添加一个空字符 \n ),由这两者中最先满足的那个结束输入。
如果 fgets() 读取到换行符,就会把它存到字符串里,而不是像 gets() 那样丢弃。
它还需要第三个参数来说明读哪一个文件,从键盘上读取数据时,可以使用 stdin(代表standard input)作为参数,这个标识符在 stdio.h 中定义。

[clef@rhel6164 c]$ cat test1.c
#include<stdio.h>
#define MAX 81

int main(void)
{
    char name[MAX];
    char *ptr;
    printf("Please input your name.\n");
    ptr = fgets(name, MAX, stdin);

    printf("name, %s\n", name);
    printf("ptr, %s\n", ptr);
    return 0;
}

编译&运行:

[clef@rhel6164 c]$ gcc test1.c //这里就没有warning出现
[clef@rhel6164 c]$ ./a.out
Please input your name.
clef
name, clef
//注意这里的换行符,因为fgets()函数没有丢弃输入的换行符
ptr, clef

[clef@rhel6164 c]$
scanf() 函数

scanf() 函数可以使用 %s 格式来读入一个字符串,scanf() 函数和 gets() 函数的主要区别在于如何决定字符串何时结束。scanf() 函数更基于获得单词(get word)而不是获取字符串(get string)。scanf() 函数有两种方法决定输入结束,无论哪一种都是遇到的第一个非空白字符开始

如果使用 %s 格式,字符串读取到(但不包括)下一个空白字符(比如空格、制表符或换行符)
如果指定了字段宽度,比如 %10sscanf() 函数就会读取10个字符或者直到遇到第一个空白字符,由二者最先满足的那一个终止输入。

字符串输出

C语言有三个输出字符串的标准库函数:puts()fputs()printf()

puts() 函数

puts() 函数使用很简单,只需要给出字符串参数的地址,它遇到空字符 \0 就会结束输出(所以必须要有空字符)。puts() 函数在显示字符串的时候,会自动在其后添加一个换行符 \n

[clef@rhel6164 c]$ cat test1.c
#include<stdio.h>
#define DEF "I am a #defined string."

int main(void)
{
    char str1[80] = "An array was initialized to me.";
    const char * str2 = "A pointer was initialized to me.";

    puts("I'm an argument to puts()."); //直接用字符串做参数
    puts(DEF); //用宏定义做参数
    puts(str1);
    puts(str2);
    puts(&(str1[5])); //必须用括号strl1[5],因为str1将会首先结合&,然后在[5]结合,将出错
    puts(str2+4);
    return 0;
}

编译&执行:

[clef@rhel6164 c]$ gcc ./test1.c
[clef@rhel6164 c]$ ./a.out
I'm an argument to puts().
I am a #defined string.
An array was initialized to me.
A pointer was initialized to me.
ray was initialized to me.
inter was initialized to me.
fputs() 函数

fputs() 函数 puts() 函数面向文件版本,两者主要的区别是:

fputs() 函数需要第二个参数来说明要写的文件,可以使用 stdout(standard output)作为参数来进行输出显示。
puts() 函数不同,fputs() 函数并不为输出自动添加换行符。
读取一行并把它回显在下一行,用下面的两种循环都可以办到:

char line[81];
while(gets(line)) //遇到文件结尾,gets()函数就会返回空指针,循环结束
    puts(line);
char line[81];
while(fgets(line,81,stdin))
    fputs(line,stdout);
printf() 函数

如同 puts() 函数一样,printf() 函数在输出字符串的时候同样需要一个字符串地址作为参数,但是 printf() 函数没有 puts() 函数方便,但是它可以格式化多种数据类型,输出的时候也不自动添加换行符。

字符串函数

C语言也有很多对字符串进行操作的函数:

scanf(格式控制,地址表列(在变量前加上取地址符&)) //输入
printf(格式控制,输出表列) //输出
gets(字符数组) //输入
puts(字符数组) //输出
strcat(字符数组1,字符数组2) //连接
strcpy(字符数组1,字符数串2或者字符数组名) //复制
strncpy(字符数组1,字符串2或者字符数组名,n) //复制n个字符串
strcmp(字符串1或者字符数组,字符数串2或者字符数组) //比较
strlen(字符串或者字符数组) //获取长度
strlwr(字符数组) //大写转小写
strupr(字符数组) //小写转大写

以上就是我为大家带来的“C++入门教程(五、数组与字符串)”,大家学会了吗?

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoungGeeker

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值