1、编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefg”。右移字符串。
按照最笨的方法:
申请(malloc)一个buf为100的空间,传字符串和buf和右移个数给func函数,经过一系列转换,得到最终值,返回buf并打印。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
char* func(char *str,char *buf,int n2)
{
char *p = str;
while (*p!='\0') p++; //p指向字符串末尾
int n = n2;
while (n--) p--; //利用n来让p偏移
printf("右移字符:%s\n",p);
for (int i = 0; *p!='\0'; i++) //将需要移动的字符寸给buf
{
buf[i] = *(p++);
}
strcat(buf,str); //将字符串追加到buf中
int k = strlen(buf); //得到buf长度
while (n2--) buf[--k]=0;; //把最后要移动字符删除
return buf; //返回buf
}
int main()
{
char *str = "abcdefg";
char *buf = malloc(100);
printf("原字符串%s\n",str);
func(str,buf,7); //右移的长度不能超过字符串长度
printf("右移后字符串:%s\n",buf);
free(buf); //记得释放空间
return 0;
}
2. 下面关于“联合”的题目的输出?
a)
#include <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266 (低位低地址,高位高地址,内存占用情况是0x010A)
我的理解是:char占1个字节,8bit,a.x[0]=10的二进制是 0000 1010, a.x[1]=1的二进制是0000 0001,因为高地址存高数据,低地址存低数据,反过来就是0000 0001 0000 1010(B) = 266(D) = 0x10A; 由于union地址共用,并且会把上一个类型的数据覆盖,因此 i 打印为266.
3、位域
计算该结构体大小:
struct bs{
unsigned int m:6;
unsigned int n: 4;
unsigned char c: 6;
};
结果大小为4个字节。这种结构体存放的是位域,即bit位。