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. Egret引擎随学随机

    1.纹理集实际上就是将一些零碎的小图放到一张大图当中.游戏中也经常使用到纹理集.使用纹理集的好处很多,我们通过将大量的图片拼合为一张图片从而减少网络请求,原先加载数次的图片资源现在加载一次即可.同时, ...

  2. urllib编码

    python: 1.unquote 2.decode 3.encode

  3. 获取token,绑定微信号,自定义菜单,事件响应demo

    摘要: 这个demo包含了获取token,绑定微信号,设置自定义菜单,响应文本和事件 这个教程的基础篇和提升篇都看完了,总感觉有点隔靴挠痒的感觉,讲的东西我都懂,没有吸收多少新鲜的知识.貌似还没有我这 ...

  4. JavaScript DOM 编程艺术(第2版)读书笔记 (9)

    三位一体的网页 结构层:由HTML或XHTML之类的标记语言负责创建: 表示层:由CSS负责完成: 行为层:负责内容应该如何响应事件这一问题.这是由JavaScript语言和DOM主宰的领域. 分离 ...

  5. node.js报错总结

    1. Error: EISDIR, read 这个报错是目标不应该是文件夹,而是其他类型,本错误出现在使用fs.createReadStream()里参数传递了个文件夹,但是应该传递个文件. 参考地址 ...

  6. 管道函数(%>%)很简单

    %>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存 符号%>%,这是管道操作,其意思是将%> ...

  7. R----stringr包介绍学习

    1. stringr介绍 stringr包被定义为一致的.简单易用的字符串工具集.所有的函数和参数定义都具有一致性,比如,用相同的方法进行NA处理和0长度的向量处理. 字符串处理虽然不是R语言中最主要 ...

  8. iOS - Mac OS X 常用快捷键

    Mac OS X 常用快捷键 1)快捷键图标: Escape 为 esc 键 无 Eject 键时用电源键代替 Space Bar 为空格键 2)基本快捷键: command + x 剪切文字 com ...

  9. iOS - OC NSStream 文件流

    前言 @interface NSStream : NSObject @interface NSOutputStream : NSStream 1.文件流的使用 NSString *filePath = ...

  10. 前端开发流程之(线上)绝对地址(图片+css+js)

    重要提醒:前端写完-----发邮件通知项目组 1:写好的前段资源包上传到SVN上之后,相关的图片.CSS.js文件要换成线上地址给后台开发. 2:图片-----压缩(https://tinypng.c ...