标签:不同 s函数 hello 换行 地址 等价 溢出 整型 clu
例题:输入n个学生的成绩,求他们的平均成绩,并求出成绩大于平均分的人数
先考虑求平均成绩,代码怎么写?
#include <cstdio>
int main() {
int n, score, sumn = 0;
double aver;
scanf("%d", &n);
for (int i = 0; i < n; ++i) { //边读边累加求和
scanf("%d", &score);
sumn += score;
}
aver = (double)sumn / n;
}
分析:要求出人数,必须先求出平均数,但是score里面保存的是最后一个学生的成绩,但我们需要的是所有学生的成绩,因此,我们必须借助数组来实现这个保存数据的功能了
数组的概念
数组是连续存储数据的集合。
? 格式:数据类型 数组名[常量表达式];
例如:
int a[10]; //定义能存储10个整形变量的数组,下标是:0~9
char c[100];//定义能存储100个字符变量的数组,下标是:0~99
double f[5];//定义能存储5个双精度实数变量的数组,下标是:0~4
以下方式定义数组是错误的:
int n;
scanf("%d", &n);
int a[n];//不能用变量n定义数组
数组的初始化可以在定义时一并完成,有多种形式:
顺序指定全部元素的初始值
int a[5] = {1,2,3,4,5};
顺序指定部分元素的初始值
int x[10] = {0,1,2,3,4};//该方法仅对数组的前5个元素依次进行初始化,其余值为0。
对数组元素全部初始化为0,可以简写为:{}或{0}
int a[5]={};//将数组a的5个元素都初始化为0。
初始化时不指定数组元素的个数
int a[]={1, 2, 3};//该方法会定义一个长度为3的数组,每个元素初始值依次为1, 2, 3。
注意:初始化时,{}里面的元素个数不能超过数组的大小。
引用的格式:数组名[常量表达式]
数组引用的规定:
a[5] = 34;
实现了给 a[5] 赋值为 34。例如(假设i, j均为整型):
a[5] //引用a数组下标为5的元素
a[i + 1] //先计算表达式 i+1 的值再引用相应值作为下标的元素
a[++j] //先计算表达式 ++j 的值再引用相应值作为下标的元素
例如:输入 n 个整数,并将他们输出。
int n, a[20];
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n; ++i) {
printf("%d ", a[i]);
}
此时,我们返回开头的例题,并完成
#include <cstdio>
int main() {
int n, score[100], sumn = 0;
double aver;
scanf("%d", &n);
for (int i = 0; i < n; ++i) { // 计算分数总和
scanf("%d", &score[i]);
sumn += score[i];
}
aver = (double)sumn / n;
int cnt = 0;
for (int i = 0; i < n; ++i) { // 统计分数大于平均分的人数
if (score[i] > aver) {
++cnt;
}
}
printf("%lf %d", aver, cnt);
return 0;
}
? 格式:数据类型 数组名[常量表达式1][常量表达式2];
int a[10][5]; //定义一个10行5列的存储整形变量二维数组
float b[20][9];//定义一个20行9列的存储单精度实数变量二维数组
char c[100][120];//定义一个100行120列的字符变量二维数组
二维数组定义的规则与一维数组一样,不再赘述。
一维数组与二维数组直观上的区别:
二维数组:
数组的初始化可以在定义时一并完成,有多种形式:
顺序指定全部元素的初始值(每一行数据单独写在一个花括号里,中间以逗号隔开)。
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
顺序指定部分元素的初始值。
int x[10][2] = {{0, 1}, {2}, {3, 4}};//该方法仅对数组对应位置的元素依次进行初始化,其余值为0。
对数组元素全部初始化为0,可以简写为:{}或{0}。
int a[5][3] = {};// 将数组a的15个元素都初始化为0。
初始化时不指定行数,但必须指定列数。
int a[][2] = {{1, 2}, {3, 4}};//该方法会定义一个2行2列的数组,每个元素初始值依次为1, 2, 3, 4。
注意:初始化时,{}里面的元素个数不能超过数组的大小。
? 引用的的格式:数组名[行下标][列下标]
数组引用的规定:
下标可以是任意值为整型的表达式,该表达式里可以包含变量和函数调用。
行(列)下标的范围是0到数组的最大行(列)数减1,引用时,下标值应在数组合法的下标值范围内。
例如定义数组int a[3][3]
,则元素分别为:
a[0][0], a[0][1], a[0][2]
a[1][0], a[1][1], a[1][2]
a[2][0], a[2][1], a[2][2]
C 语言只能逐个引用数组元素,而不能一次引用整个数组。
数组元素可以像同类型的普通变量那样使用,对其进行赋值和运算的操作,和普通变量完全相同。
例如:a[2][2] = 34;
实现了给a[2][2]
赋值为34。
例如(若i, j均为整型):
a[5][10] //引用a数组第5行第10列的元素
a[i+1][j-1]//先计算再引用
a[++j]
例如:输入 n 行 m 列的整数,并将它们输出。
int n, m, a[20][20];
scanf(“%d%d”, &n, &m);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
scanf(“%d”, &a[i][j]);
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
printf(“%d ”, a[i][j]);
}
printf("\n");
}
我们拿一维字符数组的讲解作为示例,多维的类似于上面的方法。
char 数组名[常量表达式];
char sz[100];
字符数组的初始化的方式有两种:
用字符初始化
char sz1[5]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’};
用字符串常量初始化
char sz1[5] = {“abcd”};
char sz2[5] = “abcd”;
引用就不多说了,其他类型的数组用法完全一样。
输入
从键盘输入一个字符数组可以使用scanf函数或cin.getline()函数。
scanf 函数
格式:scanf("%s", 字符数组名);
说明:
这里的字符串名称之前不加&。例如:scanf(“%s”,&s1);
是错误的。
系统会自动在输入的字符串常量后添加’\0’作为字符串结束的标志,因此定义字符数组时,要保证数组大小严格大于输入的字符的个数。
遇到空格、换行符、tab作为一个字符串输入的结束。
scanf(“%s%s%s”,s1,s2,s3);//从键盘输入Let us go,则三个字符串分别获取了三个单词。
cin.getline() 函数
#include <iostream>
及using namespace std;
两者的区别:
scanf是以空格、tab或回车作为输入结束的标志
cin.getline则可以读取空格、tab、回车,以限定的长度或结束符来停止输入。
scanf("%s", sz);//遇到空格、回车、换行或文件结束读入截止
cin.getline(sz, 50);//读入前49个字符,如果输入少于49遇到回车换行或EOF截止
cin.getline(sz, 50, 'u');//如果存在字符'u'读到'u'截止,否则读满49字符或提前遇到EOF
输出
输出同样有两种方法
printf()函数
格式:printf("%s", 字符数组名);
说明:
printf(“%s”,a[5]);
是错误的。puts()函数
格式:puts(字符数组名);
说明:
str,printf(“%s\n”, str)
和 puts(str)
是等价的。函数原型:char * strcat ( char * destination, const char * source );
功能:
source
所指向的字符串(包括‘\0‘)复制到destination
所指向的字符串后面。destination
后的 ‘\0‘destination
足够长,以容纳被复制进来的source
。source
中原有的字符不变。destination
的指针eg:
char s[100]="hello",s1[100]="Jerry"
strcat(s," world");//把字符串" world"复制并连接到字符传s的后面并在后面添加'\0'
strcat(s,s1);//把字符串s1及最后的'\0'复制并连接到字符传s的后面
函数原型:char * strncat ( char * destination, const char * source, size_t num );
功能:
source
字符串的前num
个元素连接到destination
后面。source
字符串长度小于num
复制到终止符‘\0‘为止,包括终止符。source
中原有的字符不变。destination
的指针eg:
char s[100]="hello",s1[100]="Jerry"
strncat(s," world",3);//把字符串前3个字符" wo"复制并连接到字符传s的后面并在后面添加'\0'
strncat(s,s1,10);//s1的长度不足10,把字符串s1及最后的'\0'复制并连接到字符传s的后面
函数原型:char * strcpy ( char * destination, const char * source );
功能:
source
指向的字符串包括终止符复制到 destination
source
足够大,能够容纳下destination
,否则会导致溢出错误。source
中原有的字符不变。destination
的指针eg:
char s[100]="hello",s1[100]="Jerry"
strcpy(s,"world");//把字符串"world"复制并覆盖s字符串,在后面追加终止符
strcpy(s,s1);//把字符串s1包括终止符复制到字符串s,并覆盖s字符串
函数原型:char * strncpy ( char * destination, const char * source, size_t num );
功能
source
字符串的前num
个元素拷贝到 destination
source
的元素个数少于 num
个拷贝到终止符为止,包括终止符source
的元素个数大于等于num
个,则直接复制这 num
个字符,后面不添加终止符source
中原有的字符不变。destination
的指针eg:
char s[100]="hello",s1[100]="Jerry"
strncpy(s,"world",3);//把字符串"world"前3个字符"wor"复制并覆盖s字符串,在后面不追加终止符
strcpy(s,s1,10);//把字符串s1包括终止符复制到字符串s,并覆盖s字符串
函数原型:int strcmp ( const char * str1, const char * str2 );
功能
str1
和str2
的大小ASCII
str1<str2
时返回负数,相等返回0,大于返回正数eg:
char s1[100]="hello",s2[100]="Jerry"
int x = strcmp(s1,s2);//x>0,因为s1[0]>s2[0]
int x = strcmp("hello,","hello");//x>0,因为两字符串前五个字符相同,s1[5]==' ',而s2[5]=='\0'
int x = strcmp("hello","hello");//x=0,两字符串相等
函数原型:int strncmp ( const char * str1, const char * str2, size_t num );
功能
str1
和str2
前num
个字符的大小num
个为止str1
的前num
个字符 小于str2
的前num
个字符时返回负数,相等返回0,大于返回正数eg:
char s1[100]="hello",s2[100]="hello,world"
int x = strcmp(s1,s2,5);//x=0,因为两字符串的前五个字符均相对
int x = strcmp(s1+1,s2,5);//x<0,因为s1+1的第一个字符为'e',比s2的第一个字符'h'小
int x = strcmp(s1,s2,10);//x<0,s1是s2的子串
char * strstr (char * str1, const char * str2 );
str2
是str1
的一个子串,则返回一个指向str2
在str1
中首次出现的位置str2
不是str1
的一个子串,则返回空指针NULL
标签:不同 s函数 hello 换行 地址 等价 溢出 整型 clu
原文地址:https://www.cnblogs.com/hbhszxyb/p/12232077.html