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';
}