1.空串一定比空格打头的字符串小
空串的值为"\0"即在计算机asc值为:0空格开头的字符的asc值为:32
2.c语言中有字符类型的常量和变量(×)
C语言中没有字符串类型;
3.union结构体中以数据类型字节最大的,作为内存字节
4. 若有定义:int w[3][5];
1)*(*w+3) *w取的是第0行第0列 w[0][3] 不是w[3][0]
2)*(*w+1)[4] *(w+1)虽代表的是第一行的地址,但没有*(w+1)[4] 这种表示
3)*(*(*w+1)) 每1行第0列个数,即 w[1][0]
4)*(&w[0][0]+1) 等价于 w[0][1]
区分好1)跟2)
5.若有定义:char *x="abcdefghi";,以下选项中正确运用了strcpy函数的是
A、char y[10];strcpy(y,x[4]);
B、char y[10];strcpy(++y,&x[1]);
C、char y[10],*s;strcpy(s=y+5,x);
D、char y[10],*s;strcpy(s=y+1,x+1);
A,错误,x[4]是第4个元素,不是地址,即字符e,正确格式为:strcpy(字符数组地址s1,字符数组地址s2)
B,错误,&x[1]是取第1个元素的地址,copy字符串"bcdefghi",但y是常量地址,不可以进行++y
C,错误,s是从y的第5个元素开始的空间,长度只有5个字符,而x有10字符空间,s1大小大于s2
D,正确,x+1是第1个元素的地址,copy字符串"bcdefghi",到y[1]开始的单元
6.
#include <stdio.h>
int add(int a, int b)
{ return (a+b); }
int main( )
{
int k, (*f)( ), a=5, b=10; f = add;
return 0;
}
则下列函数调用语句错误的是( C )。
A)k = (*f)(a, b); B)k = add(a, b); C)k = *f(a, b); D)k = f(a, b);
AB直接调用函数名 (系统会转成函数指针)
D直接调用函数函数指针
7.unsigned int x=0xFFFF; /* x 的初值为十六进制数 */
printf("%u\n", x);//65535
8.结果:4,5,6,4,5,6,
fread 是从文件读取3个int,放在数组a中,导致前三个数被改动了
int i, a[6]={l,2,3,4,5,6};
fp=fopen("d3.dat", "w+b");
fwrite(a, sizeof(int), 6, fp);
/*该语句使读文件的位置指针,从文件头向后移动 3 个 int型数据*/
fseek(fp, sizeof(int)*3, SEEK_SET);
fread(a, sizeof(int), 3, fp);
fclose(fp);
for(i=0; i<6; i++)
printf("%d,", a[i]);
9.char a[7]="a0\0a0\ 0";
int i, j;
i = sizeof(a);
j = strlen(a);
结果:i=7;j=2
strlen以'\0'结束,所以a0就已经停止计数了
sizeof正常计算,而且它把“”隐含的\0也计算进去
10.设 fun()函数的定义形式为( )void fun(char ch, float x){ … }
则下列对函数 fun 的调用语句中,正确的是D
A)fun("abc",3.0); B)t=fun('D',16.5);
C)fun('65',2.8); D)fun(32,32);
A)调用fun的第1个参数是字符串常量与字符变量不匹配
B)没有返回值
C)的第1个参数是错误的字符常量,字符常量是用单引号括起来的一个字符
D)自动转换
11.
int a[ ]={2,4,6,8,10}, y=0, x, *p;
p = &a[1];
for(x=1; x<3; x++)
y += p[x];
printf("%d\n", y); //14
因为p=&a[1],p[0]=a[1],p[1]=a[2],p[2]=a[3]。for循环是求p[1]+p[2]
12.
void sum(int a[ ])
{a[0] = a[-1] + a[1];}
int main( ) {
int a[10]={1,2,3,4,5,6,7,8,9,10};
sum(&a[2]);
printf("%d\n", a[2]);
a[-1]在这道题并不报错
调用sum(&a[2])时,a[0]=a[2]=3,a[-1]=a[1]=2,a[1)=a[3]=4,因此a[2]=6
sum函数的功能是将数组的一项的值改成其前一项的值与后一项的值之和
13.递归比较繁琐,要懂得如何去变
# include <stdio.h>
# include <string.h>
void fun(char *s,char *t)
{
//第一次s=efg,t=cdefg
char k;
k=*s; //k=e
*s=*t; //str[10]="abcdcfg"
*t=k; //str[10]="abedcfg"
s++;t--; //s=fg,t=bedcfg
if(*s)
fun(s,t);
//第二次s=fg,t=bedcfg,结果str[10]="afedcbg"
//第三次s=g,t=afcdcbg,结果str[10]="gfedcba"
}
void main()
{
char str[10]="abcdefg",*p;
p=str+strlen(str)/2+1; //p指向efg
fun(p,p-2); //p-2指向cdefg
printf("%s\n",str);
}
14.
int main(int argc, char** argv)
{
int n = 0 , i;
for(i = 1 ; i < argc ; i++)
n = n * 10 + *argv[i]-'0';
printf("%d\n",n);
return 0;
}
C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为:
int main (int argc,char *argv[]){…}或者
int main (int argc,char **argv){…} 其中第一个表示参数的个数;第二个参数中argv[0]为自身运行目录路径和程序名,argv[1]指向第一个参数、argv[2]指向第二个参数……
可知输入参数有四个:
12 345 678是以字符串的形式输入的, *argv[i]取字符串第一个字母
第一次循环:n=0*10+1= 1
第二次循环:n=1*10+3=13;
第三次循环:n=13*10+6=136
15.、
int main( )
{
int a[4][4]={{l,4,3,2}, {8,6,5,7}, {3,7,2,5}, {4,8,6,1}};
int i, j, k, t;
for(i=0; i<4; i++)
for(j=0; j<3; j++)
for(k=j+1; k<4; k++)
if(a[j][i] > a[k][i])
{ t = a[j][i];
a[j][i] = a[k][i];
a[k][i] = t;
} /*按列排序*/
for(i=0; i<4; i++)
printf("%d,", a[i][i]);
return 0;
}
程序运行后的输出结果是( 1,6,5,7,)。
每一列进行从小到大的排序,再输出对角线。
16.
int m=011, n=11;
printf("%d %d\n", ++m, n++)// 10 11
m是八进制,不要用二进制转十进制!所以m是9
int x=0210;//八进制8+64*8=128
printf("%X\n", x);//十六进制88
17.
输入 1234567890<CR>,其中的 while 循环体将执行 0 次。
int main( ){
char ch;
while((ch=getchar( ))=='0')
printf("#"); return 0;
}
getchar是一回车表示输入完毕的
18.
下列程序运行时若从键盘输入:10 20 30<CR>。输出结果是 10 30 0
#include <stdio.h>
int main( ){
int i=0, j=0, k=0;
scanf("%d%*d%d", &i, &j, &k);
printf("%d %d %d\n", i, j, k);
return 0;
}
%d”表示输入一个十进制整数,而“%*d”表示跳过一个输入的十进制整数。所以,本题的scanf函数要求用户输入三个十进制整数,但只接受第一和第三个到函数的第二和第三个参数所指的内存中。
19.
#include <stdio.h>
#include <string.h>
void fun(char *s, int p, int k)
{
int i;
for(i=p; i<k-1; i++)
s[i]=s[i+2];
}
int main( ) {
char s[] = "abcdefg";
fun(s, 3, strlen(s));
puts(s);//abcfg
return 0;
}
s[5]拿走s[7]没有显示的'\0',输出的时候截断到了s[5],后面不输出
20.“n”是非法字符
'\xaa',\x表示是十六进制,a表示的是10,'\xaa'的十进制是10*16^1+10*16^0=170
puts和gets函数只能输入或输出一个字符串
21.main()
{int i, j, row, column, m;
int array[3][3]={{100, 200, 300}, {28, 72, -30}, {-850, 2, 6}};
m=array[0][0];
for(i=0; i<3; i++)
for(j=0; j<3; j++)
if(array[i][j]<m)
{m=array[i][j]; row=i; column=j;}
printf("%d, %d, %d\n", m, row, column);
}
上述程序的输出结果是 。
正确答案:
-850,2,0
要注意输出函数在for循环外面!
22.逻辑运算符两侧运算对象的数据类型可以是任何类型的数据(√)
C 语言中在字符型变量可以存放一个字符串。 ( ×)