1.读程序,写出你的分析步骤,得出结果。
typedef int (*FUNC1)(int);
//定义函数类型,名为FUNC1
typedef int (*FUNC2)(int *, int *, int *);
//定义函数类型,名为FUNC2
int inc(int a)
{
return (++a);
}
//返回a+1
int multi(int *a, int *b, int *c)
{
return (*c=*a**b);
}
//返回c,其中c=a*b
void show(FUNC2 fun, int arg1, int *arg2)
{
FUNC1 p = inc;
//定义一个p函数,类型与FUNC1相同,内容与inc函数相同。
int temp = p(arg1);
//定义一个int类型的temp,他的数值为调用p函数的返回值,其中p的参数是arg1=10,p功能与inc相同。
fun(&temp, &arg1, arg2);
//调用fun函数,三个参数为temp的地址,arg1的地址,arg2的值。fum函数的类型是FUNC2,内容与multi相同。
printf("%d\n", *arg2);
//输出arg2的值,结果为110。
}
主程序:int a = 0; show(multi, 10, &a);
2.阅读一下程序,找出错误并更改。PS:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba””
<所有头文件都已包含>
main()
{
char*src=”hello,world”;
char* dest=NULL;
int len=sizeof(src);
dest=(char*)malloc(len);
char* s=src[len];
while(len–!=0)
dest++=s–;
printf(“%s”,dest);
return 0;
}
int main()//因为最后return0,所以加上返回值int
{
char*src = "hello,world";
char* dest = NULL;
int len = strlen(src);//获取字符串大小用strlen
dest = (char*)malloc(len+1);//申请堆空间加上结束符的位置
char* s = &src[len-1];//s指向src的最后一个字符,位置在[len-1],指向一个地址,应加上取地址符
while (len-- != 0)
*dest++ = *s--;//对指针对应的字母赋值
printf("%s", dest);
free(dest);//申请的堆空间要释放
dest=NULL;//避免dest为野指针
return 0;
}
3、编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefg”
//pStr是指向以”结尾的字符串的指针
//steps是要求移动的n
void LoopMove ( char * pStr, int steps )
{
//请填充…
}
void LoopMove(char * pStr, int steps)
{
char string[100] = { 0 };
int len = strlen(pStr);//字符串的长度,不包括'\0'
int n = len - steps;//n为从字符串开始到移动后结尾字符的长度
steps %= len;//对要求移动的数字取模
strcpy(string, pStr + n);//拷贝pStr的后steps位
memcpy(string + steps, pStr, n);//在srting后追加pStr的前n位
printf("%s\n\n",&string);
}
运行:
int main()
{
char *pStr = "abcdefghi";
LoopMove(pStr, 2);
return 0;
}