C语言基础

素数函数

#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>

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值