vlambda博客
学习文章列表

C语言基础(第4-12章【归纳】)

第四章:

输入一个字符,若是大写字母,转换成小写字母,若是小写字母,则转换成大写字母输出。


#include<stdio.h>

int main()

{

char ch;

ch=getchar();

ch=(ch>='A'&&ch<='Z')? (ch+32):(ch-32);

putchar(ch);

return 0;

}




成绩百分制:

#include<stdio.h>

int main()

{

float grade;

    int mark;

scanf("%f",&grade);

mark=grade/10;

switch(mark)

{

case 0:

    case 1:

case 2:

case 3:

case 4:

case 5:printf("grade:E\n");break;

case 6:printf("grade:D\n");break;

case 7:printf("grade:C\n");break;

case 8:printf("grade:B\n");break;

case 9:

case 10:printf("grade=A\n");break;

default:printf("In put error\n");

}

return 0;

}


水仙花数:

#include<stdio.h>

int main()

{

int a,b,c,d,q;

scanf("%d",&d);

a=d/100;

b=d/10%10;

c=d%10;

q=a*a*a+b*b*b+c*c*c;

if(d==q&&d>0)

printf("%d是水仙花数!\n",d);

else printf("%d不是水仙花数\n",d);

return 0;

}


注意:题目里的感叹号也许是 全角(英文模式下)


if  esle 的嵌套语句:


#include <stdio.h>

int main()

{

double x,y;

scanf("%lf",&x);

if(x<0)

printf("y=0.00");

else 

if(x>=0&&x<=15)

{y=(4*x)/3;

printf("y=%.2f",y);

}

else 

{ y=2.5*x-10.5;

printf("y=%.2f",y);

}

return 0;

}



错题归纳:

假设变量a,b均为整型,表达式  (a=5,b=2,a>b?a++:b++,a+b)  的值是_____

后面的a+b语句,是执行玩前面的语句再执行的。


nt x=2,y=3,z=4;  则表达式x+y&&(x=y)的值为_____。

是非与否的概念,x+y>0 为1, x=y x>0 为1  所以,整体为真,所以 答案为1



C语言中,switch后的括号内表达式(  )   只可以是整型



易错题解析:

if(a>c)

b=a;

a=c;

c=b;

其实前两句话是一起的,if语句到第一个“;”就结束了。

后两句是各自独立的。

首先a>c这个不成立,所以 b=a这个就不会被操作,而是自动跳过去。

然后a=c;是将c的值赋予a,也就是此时a=3,c的值不被改变。

然后c=b;是将b的值赋予c,也就是此时c=2,b的值不被改变。

所以最终结果是a=3,b=2,c=2.




在if语句中,if后面的表达式可以是关系表达式与逻辑表达式,而不能是算术表达式。    错

可以是任意表达式





第五章+第六章:

求1~100以内 ( 包括100)能被3整除同时被5整除余数为1的所有数之和。要求用for语句完成。

#include<stdio.h>

int main()

{

int i,sum;

sum=0;

for(i=1;i<=100;i++)

{

if(i%3==0&&i%5==1)

sum=sum+i;

else continue;

}

printf("sum=%d\n",sum);

return 0;

}


用do while 语句实现反复从键盘输入一个整数,如果大于或等于零,累加求和,直到输入负数结束。然后求出平均值并输出。

#include<stdio.h>

int main()

{

int i,count;

     float sum,ave;

sum=0;

count=0;

do

{

scanf("%d",&i);

if(i>=0)

{ sum=sum+i;

count++;

}

}

while(i>=0);

ave=sum/count;

printf("AVE=%.2f\n",ave);

return 0;

}


      注意:1.if后面的语句如果大于1个语句,要用花括号,否则,例如这题,执行完sum=sum+i后,不是跳出该循环,而是执行count++

                 2.同时,do while 语句是直到型循环,所以,在do 后面的语句还要输入一个判断性的语句,该语句的判断就是while里面的。

因为,直到型,先做do里面的。




用while语句计算圆周率的近似值。(直到累加项的绝对值小于 0.00001 )

#include<stdio.h>

int main()

{

     float i,k;

double sum;

k=1.0;

    i=1;

sum=0;

while((1/i)>1e-5)

{

      sum=sum+k/i;

   i=i+2;

   k=-k;

   }

printf("pi=%.2f\n",4*sum);

return 0;

}

     注意:i这个项,如果是对(1/i)这个整体则小于1e-6       ,同时,这里还需注意的是,e表示10的.....次方,e的后面只能输入整数(正整数或着负整数)。

     如果只是对i,则i>1e6   否则,会直接退出运算,得到的结果为0.另一个结果为0的是:1/i,要写成1.0/i,应为整数(int)运算,结果抛掉了小数,保留趋向于0的整数部位。



注意:unknown character '0xa3'    像这种形式的错位是指,中文模式下的输入或者全角模式下的输入。


另一种答案(法二):#include<stdio.h>

#include<math.h>

int main()

{

     float i,n;

double sum;

n=2;

    i=1;

sum=0;

while((1/i)>1e-5)

{

      sum=sum+pow(-1,n)*(1.0/i);

   i=i+2;

   n=n+1;

   }

printf("pi=%.2f\n",4*sum);

return 0;

}

     


計算三角形周长,判断形状,判断是否可以构成三角形

if(a<0||b<0||c<0)

printf("输入数据错误,这些边不能构成三角形\n");

else if(a+b<=c||a+c<=b||b+c<=a)

     printf("输入数据错误,这些边不能构成三角形\n");


      else

  {

  if(a==b&&a==c&&b==c)

  {

  perimeter=a+b+c;

  printf("周长=%.2f\n三角形形状:等边三角形",perimeter);

  }

  else if((a==b&&a!=c&&b!=c)||(a==c&&a!=b&&c!=b)||(b==c&&b!=a&&c!=a))


  {

  perimeter=a+b+c;

              printf("周长=%.2f\n三角形形状:等腰三角形",perimeter);

  }

  else

  {

  perimeter=a+b+c;

     printf("周长=%.2f\n三角形形状:非等腰三角形",perimeter);

  }



  }



       注意:                          不可以a==c==b   

                                             要写成:(a==b&&a==c&&b==c)



/*程序功能:输入五级制成绩(A-E),输出相应的百分制成绩(0-100)区间。*/


/*提示:除在指定位置添加语句之外,请不要改动程序中的其他内容。*/


#include <stdio.h>

void main( )

{

    char grade;

printf("请输入五级制成绩(A-E):");             /* 输入提示 */

    scanf("%c",&grade);

/*请在两条星线之间填入相应的代码,输出相应的百分制成绩(0-100)区间*/

/******************************************************************/

grade=getchar():-------这是错误的一步,把这部删了,就对了!

switch(grade)

{

     case 'A':printf("%c---[90,100]\n",grade);break;

case 'B':printf("%c---[80,89]\n",grade);break;

case 'C':printf("%c---[70,79]\n",grade);break;

case 'D':printf("%c---[60,69]\n",grade);break;

case 'E':printf("%c---[0,59])\n",grade);break;

default:printf("Input Error!\n");break;

}


/******************************************************************/

    return; /* 返回 */

}


  注意这里一个很错误的过程:  已经输入过scanf函数了,但是,我这里又输入了一个getchar(),重复了!因为都代表输入性函数!



求两个数的最大公约数:#include<stdio.h>

int main()

{

    int tmp, a, b;

    scanf("%d%d", &a, &b);

    while (a%b != 0)

    {

        tmp=a%b;

        a = b;

        b = tmp;

    }

    printf("GCD=%d\n",b);

    return 0;

}



找出一个大于给定整数且紧随这个整数的素数,例如 给定整数3,找到的素数是5:

#include<stdio.h>

int main()

{

int a,i,b;

scanf("%d",&a);

i=a+1;

for(i;;i++)

{

for(b=2;b<i;b++)

{

if(i%b==0)

break;

else

{

if(b<i);

else 

break;

}   

}

if(b==i)

break;

else if(b<i);

}

      printf("prime=%d\n",i);

return 0;

}

斐波那契数列求和:

#include<stdio.h>

int main()

{

int a,b,c,sum,count;

count=1;

a=1;

b=1;

sum=0;

for(count=1;count<10;count++)

{

          a=a+b;

  b=a+b;

  sum=a+b+sum;


}

    c=sum+2;

printf("sum=%d\n",c);

return 0;

}



while 与for里面 用continue 的区别

语法区别不大。在while中continue较少使用。


相同:都是跳过剩下的循环体代码,直接到达右大括号位置。


不同:for中continue之后,接着执行 i++部分。而在while(c=='A')中,直接又回到了判真条件c=='A'这里。

实践:从不同点可看出,若在while(c=='A'){ continue; //c='B'; } 中,c=='A'始终为真,因为你把 改变条件的语句(c='B')跳过了。而for不会出现此情况,因为 for(int i = 0;i<10;i++),它的变量自增i++是写到 for()结构里面的。


另外,循环体注意有三个要素:




第七章:

1逆序存放数据(10分)

题目内容:


编写程序,输入6个整数存入数组中,按输入顺序的逆序存放在该数组中并输出。


#include<stdio.h>

int main()

{

int a[6],i;

for(i=0;i<6;i++)

scanf("%d",&a[i]);

for(i=5;i>=0;i--)

printf("%d\n",a[i]);

    return 0;

}


2找出一维整型数组中的次最大值。(10分)

题目内容:


定义一维整型数组,输入5个数,从大到小排序,输出次最大值。




#include<stdio.h>

int main()

{

int a[5],i,j,t;

for(i=0;i<5;i++)

scanf("%d",&a[i]);

for(i=0;i<5;i++)

{

for(j=i+1;j<5;j++)

{

if(a[i]<a[j])

{ t=a[i];

    a[i]=a[j];

a[j]=t;

}

else;

}

}

printf("次最大值=%d",a[1]);

return 0;

}




输入一维数组的6个元素,将最大值与最后一个交换

(注意)  这里不用再输入 for(i=0;i<6;i++)了,因为这一步要是比较所有数字的。而这一题只是比较一个数


#include<stdio.h>

int main()

{

int a[6],i,j,k,m;

for(i=0;i<6;i++)

scanf("%d",&a[i]);

k=0;

for(j=1;j<6;j++)

if(a[j]>a[k])

{

k=j;

}


m=a[k];

a[k]=a[5];

a[5]=m;

for(i=0;i<6;i++)

printf("%d\n",a[i]);

return 0;

}




输入一个正整数n,再输入n个正整数,统计偶数个数与偶数和

(数组的形式)

#include<stdio.h>

 int main()

{

      int s,c,a,b[10],i;

  c=0;

  s=0;

  printf("请输入数字的个数\n");

  scanf("%d",&a);

  printf("请输入%d数字\n",a);

  for(i=0;i<10;i++)

  scanf("%d",&b[i]);

  for(i=0;i<10;i++)

  if(b[i]%2==0)

  {

  c++;

  s=s+b[i];

  }

  printf("偶数个数=%d,偶数和=%d\n",c,s);

  return 0;

}

【独立编程】程序功能:输入一个长整数n,从高位开始逐位分离并输出。例如输入123456,程序运行结果如下图

(不用数组的办法)





#include<stdio.h>

#include<math.h>

int main()

{

int n,digit,i,m,a,p;

m=-1;

printf("输入一个正整数:\n");

scanf("%d",&n);

a=n;

p=a;

while(n!=0)

{

digit=n%10;

n=n/10;

m++;

}

printf("从高位逐渐分离并输出的结果为:%d,",digit);

for(i=m;i>0;i--)

{

a=p;

a=a-(digit*pow(10,m));

p=a;

m=-1;

while(a!=0)

{

digit=a%10;

a=a/10;

m++;

}

printf("%d,",digit);

}

return 0;

}


a[i]=9*(i-2+4*(i>3))%5;     先判断 i 是否大于3 若果成立 返回1 反之返回0

数组的下标通常是float型。错。应为整数或整数表达式。

数组可以声明为任何数据类型,包括任何基本数据类型和引用数据类型

数组名定名规则和变量名相同,






以下能对一维数组a进行正确初始化的语句是()

A:int a[10]=(0,0,0,0,0) B:int a[10]={}; C:int a[]={0}; D:int a[10]={10*1};


A 写成括号不对

B {}中没写值,不对

C 正确,数组直接赋初值可以不标数组元素个数,会根据后面赋值个数自动分配空间

D 正确,但要注意这样写只是给a[0]赋值10,其余的9个赋值为0,而不是将十个都赋值成1




猴子吃桃子问题:猴子第一天摘下若干个桃子,当即吃了一半多一个,第二天将剩下的桃子吃掉一半多一个,以后每天都吃掉前一天剩下桃子的一半多一个。到第10天想再吃时,只剩下一个桃子。求第一天猴子共摘了多少个桃子?






#include<stdio.h>

int main()

{


   int i,x1,x2;

   x2=1;

   for(i=10;i>1;i--)

   {

   x1=2*(x2+1);

   x2=x1;

   }

      printf("猴子第一天共摘了%d个桃子",x1);

  return 0;

}




求1—10000之间所有水仙花数。水仙花数就是满足各位数字的立方和等于它本身的数。


#include<stdio.h>

int main()

{

int i,digit,count,sum,a;

printf("1-10000间的所有水仙花数:\n");

count=0;

sum=0;

for(i=1;i<=10000;i++)

   a=i;

while(a!=0)

{

    digit=a%10;

a=a/10;

sum+=digit*digit*digit;

}

if(i==sum)

{

           count++;

   printf("%d\n",i);

   sum=0;

}

}

printf("一共有%d个\n",count);

return 0;

}                                                                         注意:这里要小心,不可以重复利用i。当进行i的重复循环时,i会改变,i又变为0,所以,在for循环的第一步,就要将i的值赋给另一个变量。用这个新的变量,进行运算。



第八章:

大写字母到小写字母   ASCII增加32;

小写字母到大写字母   ASCII减少32;

如果要做字母与数字的ASCII码比较应该加单引号 如是'A'>'2'

判断是字母还是数字:

ch = getchar(); //ch相当于一个字符变量,现在需要Get(得到)这个字符变量的内容

if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') //判断:如果ch字符的值大于a,并且小于z;ch字符的值大于A,并且小于Z

printf("您输入的是字母!\n"); //输出是字母

else if (ch >= '0' && ch <= '9') //另外如果ch字符的值大于0并且小于9的话

printf("您输入的是数字!\n"); //输出是数字

将字符串的小写字母转换为大写字母。(提示:不允许使用字符串转换函数):

#include<stdio.h>

int main()

{

   char a[8],i;

   gets(a);

    for(i=0;i<8;i++)

{

if(a[i]>='a'&&a[i]<='z')

a[i]=a[i]-32;

else if(a[i]>='A'&&a[i]<='Z');

else ;

}

puts(a);

return 0;

}

将两个字符串连接,不要用stract函数:

#include<stdio.h>

int main()

{

char a[10],b[10];

int i,j;

i=0,j=0;

gets(a);

gets(b);

    while(a[i]!=0)

i++;

while((a[i++]=b[j++])!=0);

puts(a);

return 0;

}

对两个数组a和b进行如下初始化


char a[]=”ABCDEF”;

char b[]={‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’}




第一个是 字符串,第二个是字符数组 ,字符串以'\0'为结束符号,字符数组不用

a比b长。





strlen的结果要在运行的时候才能计算出来,主要用来计算字符串的长度,不是类型占内存的大小,strlen只能用char*做参数,且必须是以''\0''结尾的

使用strlen函数可以求出一个字符串的存储长度(!!!!!!!!不包含‘\0’字符!!!!!)。


在程序中可以对数值数组中的数据进行整体使用(错误!!)


while(a[i++]!='\0')   像这种  a[i++],在括号里面。显示判断a[i],在a++.再进行while循环。



strcat(a,b)所以:a="ABLMNP"; b=“LMNP”


#include "stdio.h"


#include"string.h"


int main( )


{char a[80]="AB",b[80]="LMNP";


int i=0;


strcat(a,b);


while(a[i++]!='\0')


b[i]=a[i];


puts(b);


return 0;


}


答案:LBLMNP




注意这个题型:char c='a',t[50];

在一个字符数组中查找一个指定的字符

                                                             是写成这样的形式:t[k]==c

若没有给出c='a'这种 形式则写为   他t[k]=='a'



注意一个事:int max=a[i],min=a[i] 这种形式,中间可以写上逗号

否则  max=a[i];min=a[i];    中间是分号!! 




一个FOR循环的新功能,找到要插入的位置:

/*在两条度星线间填入代码知, 在数组a中查找整数x应插入的位置道 */

/**********************************************************/

for(i=0;i<n && a[i]<x;i++);


这里一定要注意的问题:for()  后面一定要加分号;

/*在两条星线间填入代码, 将a[i]到a[n-1]间的所有元素后移一个位置*/

/**************************************************************/

       for(j=n;j>i;j--)

   a[j]=a[j-1];



在数组输出的时候,可以多空几位,方便看;---------- printf("%6d",a[i]);



getchar函数每次只从缓冲区中接受一个字符。




第九章:

编写函数计算银行存款本息,在主函数中从键盘输入银行存款金额(money)、存款周期(year)和年利率(rate),调用计算银行存款本息函数,根据下面公式计算存款到期时的本息合计(sum),返回到主函数输出本息合计金额(要求保留2位小数)。

程序:#include<stdio.h>

#include<math.h>

 double M(int money,int year,double rate) 

 {

    double sum;

sum=money*pow((1+rate),year);

return sum;

 }

 int main()

 {

int money,year;

double rate,sum;

scanf("%d%d%lf",&money,&year,&rate);

sum=M(money,year,rate);

     printf("sum=%.2f",sum);

return 0;

 }

         

提示:程序需要包含数学头函数库。    money、year使用整型变量,sum、rate使用双精度实型变量。




十进制转换为二进制:一直到余数为0.




将十进制转换为二进制:#include<stdio.h>

int M(int m)

{

int y,q,j,a[20];

int i=0;

while(q!=0)

{

  y=m%2;

q=m/2;

m=q;

a[i]=y;

i++;

}

       m=0;

for(j=i-1;j>=0;j--)

m=m*10+a[j];

return m;

}


int main()

{

int m,c,x;

scanf("%d",&m);

c=M(m);

printf("%d\n",c);

return 0;

}


这里注意一个点:就是将算出来的结果反序得到真正的二进制结果。(注意,只是适用于二进制)

 m=0;

for(j=i-1;j>=0;j--)

m=m*10+a[j];

return m;                !很重要!

在函数声明的时候记得:  声明的函数后面要加分号  ;

return 语句:

首先,除非你使用void函数,其他类型函数必须有return语句,如果没有return,不能通过编译。也就是你所谓的“带回一个不确定的值”。

所以,不是不带回值!

函数的返回值是通过!!!函数中的!!!return语句获得的

若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D  ) 


A)函数调用可以作为独立的语句存在 


B)函数调用可以作为一个函数的实参 


C)函数调用可以出现在表达式中 


D)函数调用可以作为一个函数的形参





一个函数中可以有多个return,但是函数在运行时只能有一个return生效。

int f()                


   {                      


    int x;                            

      scanf("%d", &x);    


      return  x++, x+5;



不可以对其赋值!

int main()        


{                      


     float a=2.6 , b;          


     b=max(2.1, 3.6)=a++;    


  printf("%f", a+b);     


 }                                    !  不能对函数赋值!(

     b=max(2.1, 3.6)=a++;    )

函数通过return语句可以向主调用函数返回多个值  (错误)===只可以!!一个!!






第十章:

#include<stdio.h>

double a(double x, int n)

{

double m;

if(n==0)

return 1;

else 

    m=x*a(x,n-1);

return m;

}

int main()

{

double m,x;

int n;

scanf("%lf%d",&x,&n);

    m=a(x,n);

printf("%f",m);

return 0;

}


这里的递归注意一下:1.终止条件,返回值(return )尽量为常数,可以直接写成return 1;(之类的)。

2.定制的函数名,不可以和变量名字一样。【a(int b int c)   int a】 这种就是错误的。      



#include<stdio.h>

int max,min;

void m(int a[],int n)

{

int i;

i=0;

max=a[i];

min=a[i];

for(i=1;i<10;i++)

{

if(a[i]>max) max=a[i];

if(a[i]<min) min=a[i];

}

}

    int main()

{

int a[10],i;

for(i=0;i<10;i++)

scanf("%d",&a[i]);

       m(a,10);

    printf("max=%d,min=%d",max,min);

return 0;

}  




注意:因为两个函数都用到了 max  min 以为这要用全局变量!

当然,如果不用全局变量的话,需要在制作函数的部分中,m(a[],n)   写成m(a[],n,max,min)

这个时候,当在main函数中再次定义max min 时侯,main中max min的数据就是函数中的数据了。




字符数组可以存放数字。



重要的一个程序;

1.将数字转换为字符;

2.利用剥离数据的方法插入数据,或者符号。

#include<stdio.h>

#define N 30

int m(char a[])

{

int x,i,m;

i=0;

m=0;

scanf("%d",&x);  

while(x!=0)

{

   a[m]='0'+x%10;

   i++;

       m++;

   x=x/10;

   if(i%3==0&&x!=0)

       {

   a[m]=',';

       m++;

   i=0;

   }

}

a[m]='\0';

return m;

}

int main()

{

char a[N];

int n,i;

n=m(a);

for(i=n-1;i>=0;i--)

putchar(a[i]);

return 0;

}



第十一章:

注意,当数组为字符型时,不可以定义*p(int)(虽然本身*p就是整型)

应该这样写:char a[20],*p=a;

                    gets(a);

int *r; double  x; 则语句 r=&x; 是合法的  错误!

1.若有定义:char ch,*p=&ch;


通过指针p给变量ch读入字符的scanf调用语句是_     scanf("%c",p)

2.若有定义:char ch,*p=&ch;  


通过指针p用格式输出函数输出ch中字符的语句是______

printf("%c",*p)                                                                         !!!!!!  注意:是“%c”!!!



如有变量的定义char *p=”abc”; 语句 *p=’X’;是合法的。

  错误:这种定义的话,一定要  char *p="x"  才是合法的。





如有变量的定义char *p=”abc”; 语句 *p=’X’;是合法的  !(错误)!!

因为:    

指向的内容不可以写,指针可以变    这道题目改变了指针内容!



删除字符串的所有前导空格,请完善程序。


#include <stdio.h>


void f1(char *s)


{


char *t;


  t=__s_;


          while(*s==' ')


 s++;


  while(*t++=*s++); 


}


int main( )


        {


char str[80]; 


  gets(str);


  f1(str); 


  puts(str);


  return 0;


}                                             这里需要注意的是:*t=*s  这个语句,指把s[1]的转到t[1]里(然后 s[2] t[2]    以此类推) 因为t指向s  所以对t的改变就是对s的改变



第十二章:

于是对于  *p[2]  结合的方式应该是   *(p[2])    对于  (*p)[2]  显然结合方式是括号中的 *p 优先于 [2];



有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指向数组的指针变量实现。


使用数组 float score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}}

代码:

#include<stdio.h>

int main()

{

float a[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}},*p[3];

int i,j;

p[0]=a[0];

p[1]=a[1];

p[2]=a[2];

scanf("%d",&i);

switch(i)

{

case 0:for(j=0;j<4;j++)

   printf("%8.2f",*(*(p+i)+j));break;

case 1:for(j=0;j<4;j++)

   printf("%8.2f",*(*(p+i)+j));break;

case 2:for(j=0;j<4;j++)

   printf("%8.2f",*(*(p+i)+j));break;

default: ;break;

}

return 0;

}   

这里有一个要注意的地方:无论是(*p)[n]   (n 在这里是指列),还是*p[n] p[0]=a[0].......    

                                        它的输出方式都是:for(j=0;j<4;j++)

   printf("%8.2f",*(*(p+i)+j));break;

  还有要注意的是:*(*(p+i)+j)   代表a[i][i]





函数原型:char *strcpy(char *dst,char const *src)

可以利用指针实现函数返回多个值     正确:例如用指针交换两个值。

作为函数形式参数时,int x[ ][5]与int (*x)[5]两种写法等价  

因为:二位M*N数组的名字是一个指向N元数组的指针常量,int (*x)[5]  同理。

strcpy(char *p, char *q)   是连同结束字符也要复制过去的。

while(*p)   是指  p数组的第一个数字或者字母 不等于0.(同时,在此之前,P要有指向。若无,则不进行循环体。)

int (*p)[10];, 则标识符p是:   

指向含有10个整型元素的一维数组的指针

*p++ = *q的意思是

*p= *q;

p=p+1;






strcat 函数:

char s1[]="hello",s2[]="programs";

    strcat(s1,s2);





 *y+2    表示为   y[0]+2

如有定义char y[4]= "321",则表达式 *y+2的值是  5     .   当为一维数组时候,*(y+2)  就表示y[2]   *y就表示   y[0]











void strcpy4( char *p, char *q)


{   


while(*p)


  *p++=*q++;  

}





A.

char s[]="12345", t[]="6543d21";


strcpy( s,t);


0.00/2.00


B.

char s[20], *t="12345";


    strcat(s,t);



C.

char s[20]=" ", *t="12345";

    strcat(s, t); 



D.

char *s="12345", *t="54321";


  strcat (s,t);



这四道题的解析:A. 有越界嫌疑

B. s不是字符串,没有结束符 ,找不到连接点

C. 对,将t指向的字符串可连接在s(原先是空字符串)的后面

D. s和t都指向字符串常量,字符串常量存储在只读存储区中,不能被修改。

(其实就是,*p="123456798"  这个字符串是没有错误的,但是这个每个值的空间都分配满了,是个常量指针,是不可以改写的,只可以重新指向)

同理;*p="asd" 也是一样的。因为strcat(a,b)函数是改变了 a 的值,而改变必须要为变量。







在数组中,局部变量数组也是独立开来的,即使同名。

还有,在指针变量赋值的方面,尽量不要*p直接赋值, 但可以两个指针之间赋值,*p=*q; 

还有 指针的结束符号 可以赋值:*p2 = '\0'



注意 这里的一个低级错误,不是因为不可以同名,而是因为 在int main函数中的指针【char *s,*t;】定义是没有初始化的,没有指向的,他不是数字,分配了空间的。

void M(char *s ,char *t, int m);

int main()

{

char *s,*t;

int m;

scanf("%d",&m);

    M(s,t,m);

    puts(s);

    return 0;

}

void M(char *s ,char *t, int m)


正确写法:#include<stdio.h>

void M(char *s ,char *t, int m);

int main()

{

char a[20],b[20];

int n;

scanf("%d",&n);

    M(a,b,n);

    puts(a);

    return 0;

}

void M(char *s ,char *t, int m)

{

scanf("%s",t);

    m=m-1;

while(*(t+m)!='\0')

{

*s=*(t+m);

        m++;

s++;

}

    *s='\0';

}