1.字符串的翻转,这里一般是字符数组.不包括字符串字面值.

char* reversal_str(char* str,size_t size);

翻转之后的字符串是原来的字符串的翻转.

#include <stdio.h>
#include <string.h>
char* reversal(char* str,size_t len)
{
if(str != NULL)
{
char* start = str;
char* end = str + len - ;
char ch;
while(start < end) //注意这里的条件不能是start != end;因为大小如果是偶数的话,它们永远不会相等.
{
ch = *start;
*start++ = *end;
*end-- = ch;
}
}
return str;
}
int main(void)
{
char str[] = "abcdefg";
size_t len = strlen(str);
reversal(str,len);
printf("%s\n",str);
return ;
}

这里有一定的局限性,因为这样只能是在原来的地址上进行字符串的翻转;如果是字符串字面值的情况,其就不能在原来的地址上

进行翻转.下面给出一个更一般的实现,不过它的思想不是在原来的字符串的地址上进行修改,而是重新分配了一块内存来进行

字符串的翻转;它的思想是得到一个原来的字符串的翻转之后的字符串,它返回的结果是一个新的地址.

#include <stdio.h>
#include <string.h>
#include <assert.h>
char* reversal_str(char* const dest,const char* src,size_t len)
{
assert(dest != NULL && src != NULL);
char* start = dest;
char* end = dest + len - ;
char ch;
strcpy(dest,src);//把它拷贝到dest内存中.
while(start < end) //注意这里不能写成start != end;
{
ch = *start; //交换首尾字符
*start++ = *end;
*end-- = ch;
}
return dest;
} int main(void)
{
char *str1 = "abcdefg";
char str2[] = "";
char str[] = {};
size_t len = strlen(str1);
reversal_str(str,str1,len);
printf("%s\n",str);
len = strlen(str2);
reversal_str(str,str2,len);
printf("%s\n",str);
return ;
}

2.写一个函数,由用户输入一个十进制数和它想要打印这个数的进制数.函数的功能是把这个十进制

数按照用户的要求打印出来,例如如果用户输入一个数100并且想要的进制是16进制则打印的结果是

64;如果是100,进制要求是8,则结果是144

算法分析:

主要是先对进制求余数,然后是再除于这个base,直到num/base==0为止.

然后再反向打印即可.

#include <stdio.h>

void shift_base(int num,size_t base)
{
int arr[] = {},i = ;
do
{
arr[i++] = num % base;
}while(num /= base);
printf("它的%d进制的格式是:\n",base);
for(num = i - ;num >= ;num--)
arr[num] < ?printf("%d",arr[num]):
printf("%c",arr[num]-+'A');
printf("\n");
}
int main(void)
{
int num = ;
size_t base = ;
printf("请输入一个整数:");
scanf("%d",&num);
printf("你输入你要打印的进制数:");
scanf("%d",&base);
shift_base(num,base);
return ;
}

3.设计一个函数,求1! + 2! + 3! + 100!的阶乘之和!

这个题有很多中解法,但是这里有一个巧用static的诀窍,我感觉很强大.

在这里和大家分享下.

#include <stdio.h>

long factial(int n)
{
static long fac = ;
int i = ;
fac *= n;
return fac;
}
long sum_fac(int n)
{
int i;
static long sum = ;
for(i = ;i <= n;i++)
{
sum += factial(i);
}
return sum;
}
int main(void)
{
int n;
printf("请输入你要求的阶乘数:");
scanf("%d",&n);
printf("1!+2!+...%d! = %ld\n",n,sum_fac(n));
return ;
}

4.类型转换问题?先看题

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(void)
{
float a = 1.0f;
cout << (int)a << endl;
cout << &a << endl;
cout << (int&)a << endl;
cout << boolalpha << ((int)a == (int&)a) << endl;
float b = 0.0f;
cout << (int)b << endl;
cout << &b << endl;
cout << (int&)b << endl;
cout << boolalpha << ((int)b == (int&)b) << endl;
return ;
}

1)(int)a这里注意它和*(int*)&a是不同的,(int)a这里是相当于是取浮点数a的整数部分

所以结果是1.

2)&a打印的是a的地址.

3)(int&)a这里要注意了,这里相当于是打印*(int*)&a;这里的结果肯定不是1了,因为这里

相当于把地址&a里面的内容由浮点类型解释成一个整型输出了,因为float和整型的存

储的方式不同,所以打印的结果不是1.

4)根据上面的分析这里的打印结果是false;

5)由于0.0比较特殊,所以后面的打印结果是0,b的地址,0和true.

5.int和char以及char*之间的转换问题?

下面程序的打印结果.

#include <stdio.h>
int main(void)
{
unsigned int a = 0xFFFFFFF7;
unsigned char i = (unsigned char)a;
char* b = (char*)&a;
printf("%08x,%08x\n",i,*b);
return ;
}

分析:

把一个unsigned int 赋值给unsigned char的时候高字节会被截断,只留下低8位.

即f7,打印的时候又是以整型数打印的所以结果是000000f7;

而char* b = (char*)&a;这里向当于让b指向了a的地址,但是a的内容并没有变化,

最后打印的时候又是按整型打印的所以结果是fffffff7;

6.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16,...),不能使用循环语句.

分析:2的n次方就说明这个数的二进制表示只有一个1,如果这个数减去1之后,

则其前面的其他位的结果都是1.所以如果x&(x-1)的结果是0就表示它是2的N

次方.所以可以写成下面的表达式 !(X&(X-1)) 如果返回1表示它是,否则不是.

7.下面代码的结果

int  fun(int x,int y)
{
return (x&y) + ((x^y)>>)
}
fun(,) = _____________?

这里主要考察一种整型数据的用位于求表达式的问题.

(x&y)相于表示的是x和y相同位的一半.(主要是有1的位)

(x^y)表示的是(x和y)不同位的值,右移一位相当于除以2.(主要是一个是1一个是0的位)

因为用二进制求数,其实我们关注的是位数是1的地方,其他是0的地方只是在填位.

c/c++面试题(4)字符串翻转/打印任意进制格式/类型转换的更多相关文章

  1. Qt 将字符串转成16进制显示

    最近项目用到了需要将字符串转换成16进制显示.这玩意折腾了一上午. 首先,数据块内容 struct UserData { char Head[3] = {'X','J','J'}; char Flag ...

  2. 16进制字符串和byte数组进行相互转换\将10进制转换为任意进制

    16进制字符串和byte数组进行相互转换 简介 1个byte对应8个bit,16进制使用4个bit,所以一个byte转成16进制,占用两位. JAVA代码 private static final c ...

  3. 一道C语言面试题:得到整数的M进制表示字符串

    题目:输入整数n和M,输出n在M进制下的表示字符串.如n=3000,M=16,输出16进制下3000的表示字符串,为“BB8” 来源:某500强企业面试题目 思路:对n取模M,将得到的数字压入栈中,再 ...

  4. Delphi 实现16进制转字符串及字符串(中文)转16进制

    //-----------------------------------------------//16进制字符转整数,16进制字符与字符串转换中间函数//--------------------- ...

  5. 利用python实现整数转换为任意进制字符串

    假设你想将一个整数转换为一个二进制和十六进制字符串.例如,将整数 10 转换为十进制字符串表示为 10 ,或将其字符串表示为二进制 1010 . 实现 以 2 到 16 之间的任何基数为参数: def ...

  6. MFC字符串转化成16进制

    //CString m_str = _T("11"); //USES_CONVERSION; //char *m_cc = T2A(m_str); //BYTE m_bb; //s ...

  7. string字符串转成16进制

    package util; public class EscapeUnescape { public static String escape(String src) { int i; char j; ...

  8. printf用法之打印2进制,八进制,十进制,十六进制

    printf是格式化输出函数,它可以直接打印十进制,八进制,十六进制,输出控制符分别为%d, %o, %x, 但是它不存在二进制,如果输出二进制,可以手写,但是也可以调用stdlib.h里面的itoa ...

  9. 火星A+B(字符串整形转化,进制)

    Description 读入两个不超过25位的火星正整数A和B,计算A+B.需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数.例如:地球上的10进制数2,在火星上记为“1,0”, ...

随机推荐

  1. 思维导图软件MindManager for Windows中如何修改思维导图布局

    MindManager for Windows是 Mindjet公司旗下应用于Windows桌面系统的一款思维导图软件,目前已经更新到了v14版本.对于很多刚开始使用MindManager for W ...

  2. :enabled 匹配所有可用元素

    描述: 查找所有可用的input元素 HTML 代码: <form> <input name="email" disabled="disabled&qu ...

  3. Shadow Zhang PGPool 配置错误定位 s_do_auth: expecting R got E

    自从按照教程 http://www.pgpool.net/docs/latest/pgpool-zh_cn.html#hba配置好PGPool以后,每次启动 pgpool -c -n -D 都报 s_ ...

  4. 33、mybatis(二)

    第十六章回顾SQL99中的连接查询 1)内连接 2)外连接 3)自连接 第十七章回顾hibernate多表开发 1)一对一 2)一对多 3)多对多 第十八章 mybatis一对一映射[学生与身份证] ...

  5. [充电]多线程无锁编程--原子计数操作:__sync_fetch_and_add等12个操作

    转自:http://blog.csdn.net/minCrazy/article/details/40791795 多线程间计数操作.共享状态或者统计相关时间次数,这些都需要在多线程之间共享变量和修改 ...

  6. 将数组里的元素拼接成sql里的in条件

    /** * 将数组里的元素拼接成sql里的in条件,如'a1','a2','a3' * @param array * @returns */function makeSqlInStr(array){ ...

  7. php入门

    最近公司招了几个应届毕业生,他们对前端的了解还挺多,但是对后端的技术一无所知,我觉得,作为一个前端攻城狮,如果你有远大的抱负,就应该雨露均沾... 今天我就跟大家讲一讲PHP最基本的入门,至少别人问起 ...

  8. Android ActionBar的基本用法

    一  说明android 3.0后出现, 在3.0之前称为Title Bar  显示位置在标题栏上可以显示应用程序的图标和activity的标题创建方式的和系统菜单相似, 区别在于: android: ...

  9. HierarchyViewer for iOS 2.0 BETA Introduction

    We know HierarchyViewer is an useful tool in Android SDK. The developer and tester, who haven't the ...

  10. Swift高级语法学习总结

    Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.函数 1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如 ...