1.下列对字符串的定义,错误的是(A )。
A)char str[5]=”China”;
B)char str[]=” China”;
C)char *str=” China”;
D)char str[]={‘C’,‘h’,‘i’,‘n’, ‘a’, ‘\0’};
A:“China”里面包含\0所以是6个字符,数组是5,所以错误
2.判断字符串 s1 与字符串 s2 相等,应当使用:C 。
A) if (s1 = s2)
B) if (strcmp(s1, s2))
C) if (!strcmp(s1, s2))
D) if (strcmp(s1, s2) = 0
if (!strcmp(s1, s2))
是C语言中的一段代码,用于比较两个字符串s1
和s2
。
strcmp
是一个标准库函数,用于比较两个字符串。!
是逻辑非运算符,用于取反。因此,
if (!strcmp(s1, s2))
的意思是:如果s1
和s2
两个字符串相同,则执行后面的代码块。这里的
!
用于反转strcmp
的返回值。如果strcmp(s1, s2)
返回0(表示两个字符串相同),那么!strcmp(s1, s2)
的结果就是非0(真),从而执行if语句中的代码块。如果strcmp(s1, s2)
返回非0(表示两个字符串不同),那么!strcmp(s1, s2)
的结果就是0(假),不执行if语句中的代码块。
3.若有定义:int a[5]={1,2,3,4,5},*p=a;,则不能表示 a 数组元素的表达式是(C )。
A)*p
B)*a
C)a[5]
D)a[p-a]
C:表示引用a数组中序号为5的元素
4. 下面程序运行后输出的结果是_____11___________
#include void main()
{
int m=12;
if (m-->10) //在使用m之后,使m值减一,值为11;
printf("%d",m); //输出11
else printf("%d",m++);
}
5.下面程序运行后输出结果是:18
#include <stdio.h>
fun(int b[],int m,int n)
{
int i,s=0;
for(i=m;i<n;i++)
s+=b[i];
return 0;
}
void main()
{
int x,a[]={1,2,3,4,5,6,7,8,9};
x=fun(a,4,7);
printf("%d\n",x);
}
/*
m=4,n=7
1.i=4,s=0+5=5 i=5
2.i=5,s=5+b[5]=11 i=6
3.i=6,s=11+b[6]=18 i=7
*/
6.下面程序运行后输出的结果是:9
void main()
{ int i=0,s=0;
do{
if(i%2){i++;continue;}
i++;
s+=i;
}while(i<5);
printf("%d\n",s);
}
/*
i=0 s=0 i=1
i=1 s=1 i=2
i=3 s=1+3=4 i=4
i=5 s=4+5=9
*/
是奇数,则增加i并跳出循环其余部分,是偶数,则增加i,并加到s上
if(i%2){i++;continue ;}
如果变量i是奇数,那么增加i的值,并跳出当前循环的剩余部分
7.以下程序运行后的输出结果是:30,20,10
#include <stdio.h>
void fun(int a,int b,int c)
{
a=123;
b=456;
c=789;
}
void main()
{
int x=10,y=20,z=30;
fun(x,y,z);
printf("%d %d %d\n",z,y,x);
}
函数内部改变参数的值时,只改变了参数的副本的值,而不是原始变量的值
在函数内部,使用指针来访问和修改变量的值
8. 下面程序运行后输出的结果是:2,1
#include <stdio.h>
void main()
{
int a,b,c=234;
a=c/100%9;
b=(-1)&&(1);
printf("%d %d\n",a,b);
}
c=234
c/100%9 c/100等于2 2%9余数为2
b=(-1)&&1 在c语言中,非零值视为true,所以b为1
9. 以下程序的输出结果是:24
#include <stdio.h>
void main()
{
int a[3][3]={{1,2,3},{3,4,6},{5,6,7}},i.s=0;
for(i=0;i<3;i++)
s+=a[i][i]+a[i][3-i-1];
printf("%d\n",s);
}
分析:
i=0 a[0][0]=1 a[0][2]=3 s=4
i=1 a[1][1]=4 a[1][1]=4 s=12
i=2 a[2][2]=7 a[2][0]=5 s=24
10.下面的程序是对一维数组的 10 个元素中的前 5 个元素与后 5 个元素对换,即 a[0] 与 a[9]互换,a[1]与 a[8]互换,a[2]与 a[7]互换...请写出代码
#include <stdio.h>
void main()
{
int a[10],i,t;
printf("input the data:\n");
for(i=0;i<10;i++) scanf("%d",&a[i]); //输入一组数据
for(i=0;i<5;i++) //遍历数组前五个元素
{
t=a[i]; //a前五元素赋值给t
a[i]=a[9-i]; //a后五元素赋值给a前五元素
a[9-i]=t; //t前五元素赋值给a后五个
}
for(i=0;i<10;i++) //重新遍历数组
printf("%6d",a[i]); //输出数组
}
第二个for循环
这个for循环用于交换数组中的元素。具体来说,
它交换了数组的前5个元素和后5个元素的位置。
例如,它会将第0个元素与第9个元素交换,第1个元素与第8个元素交换,
以此类推,直到第4个元素与第5个元素交换。
这里使用了中间变量t来实现交换。
11.以下函数把 b 字符串连接到 a 字符串的后面,并返回 a 中新字符串的长度。
#include <stdio.h>
int strcen(char a[], char b[]) {
int num = 0, n = 0;
/*在函数strcen中,
使用int num而不是char num是因为我们需要存储的是字符的索引位置,而不是字符本身。
索引位置是一个整数,因此使用int类型更合适。
而n用于遍历字符串b,它应该是一个整数类型的变量,以存储每个字符的索引。
所以,使用char n是不正确的,应该使用int n。*/
while (*(a + num) != '\0')num++; //找到a的末尾
while (b[n])
{ //遍历b
*(a + num) = b[n]; //复制字符到a
num++; //移动到a的下一个位置
n++; //移动到b的下一个位置
}
*(a + num) = '\0'; //在a的末尾添加空字符
return num; //返回复制的字符数(不包含空字符)
}
int main()
{
char a[100], b[100];
printf("请输入字符串a:");
scanf("%s", &a);
printf("请输入字符串b:");
scanf("%s", &b);
int result = strcen(a, b);
printf("复制后的字符串a为:%s\n", a);
printf("复制后的字符数为:%d\n", result);
return 0;
}
如果你在调用函数时没有使用& 符号,但仍然能够输出字符串,那么可能是因为你传递的实际上是一个字符数组,而不是一个字符指针。在这种情况下,你不需要使用& 符号,因为数组名本身就是指向数组第一个元素的指针。例如:
char a[100];
scanf("%s", a);
strcen(a, b);
在上面的代码中,a是一个字符数组,可以直接传递给strcen函数,而不需要使用& 符号。但是,如果你传递的是单个字符,那么就需要使用& 符号来获取该字符的地址。例如:char c;
scanf("%c", &c);
strcen(&c, b);
在上面的代码中,c是一个字符变量,需要使用& 符号来获取其地址,并将其传递给strcen函数。
12 .输入一个字符串,统计其中英文字母、数字、空格以及其他字符的个数,并输出 统计结果。
#include <stdio.h>
void main()
{
char str[80];
int i,c=0,d=0,k=0,q=0;
fget(str,sizeof(str),stdin);
for(i=0;str[i]!='\0';i++)
if(str[i]=='\n')
{
continue;
}
if(str[i]>='A'&&str[i]<='Z'||str[i]>='a'&&str[i]<='z')c++;
else if(str[i]>='0'&&str[i]<='9')d++;
else if(str[i]==' ')k++;
else q++;
printf("Letter is %d\nDigit is %d\nSpace is %d\nOther is %d\n",c,d,k,q);
}
stdin是标准输入,一般指键盘输入到缓冲区里的东西。
增加了一个条件判断if (str[i] == '\n'),用于检查当前字符是否为换行符。如果是换行符,我们使用continue语句跳过当前迭代,从而忽略换行符。这样就能确保换行符不会被计入“其他字符”的数量(q),从而得到正确的结果。*