素数函数
#include <math.h>
int sushu(int x)
{
if(x==1)
return 0;
if(x==2)
return 1;
int i;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0)
{
return 0;
}
}
return 1;
}
sqrt函数要加头文件
指针
*(*(a+i)+j)
是一个指向二维数组中某个元素的指针。假设a
是一个二维数组,则*(a+i)
代表第i
行的首地址,*(*(a+i)+j)
就是第i
行第j
列的元素的值。具体解释如下:
a
是一个二维数组,它由多个一维数组组成。a+i
表示指向二维数组中第i
行的指针,也就是第i
个一维数组的首地址。*(a+i)
表示解引用指针,即获取第i
行数组的首地址。*(a+i)+j
表示获取第i
行第j
列元素的地址。*(*(a+i)+j)
表示解引用指针,即获取第i
行第j
列元素的值。
字符数组赋值
为什么只有在字符数组初始化的时候,才可以将字符串直接赋值给字符数组;初始化以后必须用strcpy函数呢?
在初始化完成以后,如果尝试将字符串直接赋值给字符数组,会导致编译错误。在C语言中,数组名不是可修改的左值,而是一个常量左值,只能用作获取数组的地址。字符串是不能赋值给常量的。所以,必须使用 strcpy 函数将字符串复制到字符数组中。
方法一:使用初始化器
可以使用初始化器在定义字符数组时直接赋值,如下所示:(字符要用单引号''括起来)
char str1[] = {'H', 'e', 'l', 'l', 'o', '\0'};
方法二:逐个赋值
可以通过逐个字符赋值的方式来初始化字符数组,如下所示:
char str3[6];
str3[0] = 'H';
str3[1] = 'e';
str3[2] = 'l';
str3[3] = 'l';
str3[4] = 'o';
str3[5] = '\0';
方法三:使用 strcpy 函数
可以使用 strcpy 函数将一个字符串复制到另一个字符数组中,如下所示:(需要注意的是:①这种方法适用于已经定义了字符数组,但想要给它赋值的情况。②需要引用头文件#include <string.h>)
char str4[20];
strcpy(str4, "Hello");
###方法四:使用指针赋值
指针初始化的时候赋值
#include<stdio.h>
int main(){
char *c;
c="This is a string";
printf("%s", c);
}
ps:
1、这里的指针变量c存储的为字符串的首地址,输出的时候可以利用%s, 和指针c输出。
2、不可以写成*c="string"
,字符串在c语言中默认按照数组来存储,而c存储的仅为地址。
#include <stdio.h>
int main(){
char *a="I love China!";
a=a+7; //改变指针变量的值,即改变指针变量的指向
printf("%s\n",a); //输出从a指向的字符开始的字符串
return 0;
}
可以看出,指针变量是可以直接赋值的
下面能正确给字符串s赋值的是( )。
A.
char s[6]="ABCDE";
B.
char s[5]={'A','B','C','D','E'} ;
C.
char s[6] ; s="ABCDE";
D.
char *s; scanf("%s",s);
正确的选项是 A。
选项 A 中声明了一个字符数组 s,同时进行了初始化,可以直接将字符串 "ABCDE" 赋值给 s。
选项 B 中也声明了一个字符数组 s,但是使用了花括号进行初始化,这种方式只适用于声明数组时进行初始化,不能在其他地方赋值。
选项 C 中先声明了字符数组 s,但是没有进行初始化,接着尝试用字符串常量赋值,这种方式是不允许的。
选项 D 中声明了一个指向字符的指针 s,但是没有为其分配内存空间,使用时需要先为其分配空间,否则会发生未定义行为。
.若有语句:char s1[]="string1",s2[8],*s3,*s4="string2"; 则对库函数strcpy的错误调用是_____
A.
strcpy(s1,"string2");
B.
s4 = s2; strcpy(s4,"string1");
C.
strcpy(s3,"string1");
D.
strcpy(s2,s1);
结果选C:
分析:字符指针定义的时候没有初始化不分配内存空间,strcpy 是将字符串放到一个空间中,所以C选项s3 没有分配空间,也就是常说的野指针,字符串你要放到哪里去,它都没分配空间。
扩展: 所有指针仅仅进行声明定义,编译的时候不分配给它空间。
字符串
字符串的比较(易错)
strcmp(s1,s2)
若s1跟s2一样 strcmp==0
若 s1>s2 strcmp(s1,s2)>0
若 s1<s2 strcmp(s1,s2)<0
易错点
【1】
k = f(a++); k先等于f(a) 然后 a再++;
a = c++; a是先等于c的值 c再加1;
因为是后缀
【2】
FILE *fp;
double x=3.1415;
int y=12;
fp=fopen("test.txt","w");
fprintf(fp,"%f",x);
rewind(fp);
fprintf(fp,"%d",y);
fclose(fp);
fp=fopen("test.txt","r");
fscanf(fp,"%d",&y);
printf("%f,%d",x,y);
fclose(fp);
A.
3.141500,12
B.
3.141500,12141500
C.
3.141500,3
D.
3.141500,123
调整文件的光标,并不能,加在3.1415 前面形成 123.1415;
会进行覆盖 3.1415 被覆盖成 121415;
取整知识点
1.floor函数
功能:把一个小数向下取整
即就是如果数是2.2 ,那向下取整的结果就为2.000000
原型:double floor(doube x);
参数解释:
x:是需要计算的数
返回值:
成功:返回一个double类型的数,此数默认有6位小数
无失败的返回值
头文件:#include<math.h>
2.ceil函数
功能:把一个小数向上取整
即就是如果数是2.2 ,那向上取整的结果就为3.000000
原型:double ceil(doube x);
参数解释:
x:是需要计算的数
返回值:
成功:返回一个double类型的数,此数默认有6位小数
无失败的返回值
头文件:#include<math.h>
3.round函数
功能:把一个小数四舍五入
即就是如果数是2.2 ,那四舍五入的结果就为2
如果数是2.5,那结果就是3
原型:double round(doube x);
参数解释:
x:是需要计算的数
头文件:#include<math.h>