C/C++语言中没有特殊的字符串变量,通常使用字符数组来存储字符串。字符串以""结尾。C/C++提供了丰富的字符串处理函数。下面是一些最常用的函数。
●字符串输出函数puts。●
C/C++语言中没有特殊的字符串变量,通常使用字符数组来存储字符串。字符串以""结尾。C/C++提供了丰富的字符串处理函数。下面是一些最常用的函数。
●字符串输出函数puts。
●字符串输出函数gets。
●字符串连接函数strcat。
●字符串复制函数strcpy。
●字符串长度测量功能strlen。
字符串是面试考察相关知识的重点部分。通过考察string的相关知识,可以考察程序员的编程规范和编程习惯。而且包含了很多知识点,比如内存越界、指针和数组操作等。很多公司会要求应聘者写一个程序,在面试的时候复制字符串或者字符串的子字符串。本章列举了一些与字符串相关的面试问题,其中有些问题对编程技巧要求较高。
用数字字符串进行转换求职时,数字和字符串之间的转换经常会出现问题。面试官用这些问题来考察应聘者的能力,比如是否熟悉常用的库函数、ASCII码以及字符串的存储格式。
将数字转换为字符串。面试示例1:使用库函数将数字转换成字符串。考点:C库函数中把数字转换成字符串的用法。
出现频率:★★★
解析
c语言提供了几个标准库函数,可以转换任意类型的数字(整数、长整数、浮点等。)成串。下面是每个函数的方法及其描述。
● itoa():将整数值转换为字符串。
● ltoa():将长整型值转换为字符串。
● ultoa():将无符号长整型值转换为字符串。
● gcvt():将浮点数转换为字符串,并对其进行舍入。
● ecvt():将双精度浮点值转换为字符串,转换结果不含小数点。
● fcvt():指定位数为转换精度,其余同ecvt()。
还可以使用sprintf系列函数将数字转换成字符串,比itoa()系列函数要慢。下面的程序演示了如何使用itoa()函数和gcvt()函数:
程序输出结果:
str_int: 435
str_double: 435.10001
●代码第11行参数10表示按十进制类型进行转换,转换后的结果为“435”;如果按二进制类型进行转换,结果是“1101110011”。
●代码第12行的参数8表示精确的位数,这里得到的结果是“435.10001”。
回答
您可以使用atoi系列函数将数字转换为字符串。
面试示例2:不使用库函数将整数转换成字符串。考点:将数字转换成字符串,了解相关ASCII码。
出现频率:★★★★
解析
如果不使用atoi或sprintf之类的库函数,可以通过加“0”的方式,将整数的每一位上的数字转换成char类型,存储在字符数组中。但是,需要注意的是,需要字符串的逆序。如以下过程所示:
程序中的int2str函数完成了int类型到字符串类型的转换。在代码第46行对int2str函数做了测试。程序的执行结果如下所示:程序中的int2str函数完成了从int类型到string类型的转换。int2str函数在代码的第46行进行了测试。程序的执行结果如下:
请输入整数:1234
输出:1234
如果输入是负数,程序执行结果如下:
请输入一个整数:-1234
输出:-1234
接下来分析int2str函数的实现。
●在代码的第9行,将参数n的绝对值赋给temp,然后在计算每一位的整数时使用temp,这样可以保证在负数的情况下不会有问题。
●代码第11 ~ 14行判断str的有效性,str不为空。
●在代码第15 ~ 19行的while循环中,N的每一位都存储在局部数组buf中,存储顺序与整数顺序相反。比如n是123456的整数,while循环结束后buf应该是“654321”。
●代码的第21行计算转换后的字符串的长度len。如果是负数,长度应该增加1。
●代码的第22 ~ 31行将数组buf中的非零元素反向复制到参数str指向的内存中。如果n为负,str指向的第一个内存存储负号。
将字符串转换为数字面试示例3:使用库函数将字符串转换为数字。考点:C库函数中把字符串转换成数字的用法。
出现频率:★★★★
解析
与上一节将数字转换为字符串类似,C/C++语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等。).下面列出了每个函数的方法及其描述。
● atof():将字符串转换为双精度浮点值。
● atoi():将字符串转换为整数值。
● atol():将字符串转换为长整型值。
● strtod():将字符串转换为双精度浮点值,并报告所有无法转换的剩余数字。
● strtol():将字符串转换为长整型值,并报告所有无法转换的剩余数字。
●strtool():将字符串转换为无符号长整型值,并报告所有无法转换的剩余数字。
下面的程序演示了如何使用atoi()函数和atof()函数。
输出结果:
数量_整数:435
num_double: 436.55万
面试示例4:不使用库函数将字符串转换为数字。考点:字符串转换成数字时对相关ASCII码的理解。
出现频率:★★★★
解析
程序代码如下:
程序执行结果:程序执行结果:
输入:1234
输出:1234
输入:-1234
输出:-1234
输入:+1234
输出:1234
程序中的str2int函数用于将字符串转换为整数。与例2中的int2str函数相比,该函数的转换过程更简单。它只需要做一个while循环(代码的第13行)来计算数值。如果结果是否定的,加一个负号。
C++字符串,数字转换一、将CString转换为CTime的几种方法
CString timestr = & # 82202000年4月5日”;
int a,b,c;
sscanf(timestr。GetBuffer(timestr。GetLength()),”第%d年第%d月第%d天”,& amp一,& ampb &c);
CTimetime(a,b,c,0,0,0);
——–或者–———————
CString s(“2001-8-29 19:06:23”);
int nYear,nMonth,nDate,nHour,nMin,nSec
sscanf(s,“% d-% d-% d % d:% d:% d ”,& amp尼尔& ampn月& ampnDate &nHour &nMin &nSec);
CTime t(nYear,nMonth,nDate,nHour,nMin,nSec);
———或者————————
CString timestr = & # 82202000年4月5日”;
int年、月、日;
字节TT[5];
//获取年份
memset(tt,0,sizeof(TT));
TT[0]= timestr[0];
TT[1]= timestr[1];
TT[2]= timestr[2];
TT[3]= timestr[3];
year = atoi((char *)TT);
//获取月份
memset(tt,0,sizeof(TT));
TT[0]= timestr[6];
TT[1]= timestr[7];
month = atoi((char *)TT);
//获取日期
memset(tt,0,sizeof(TT));
TT[0]= timestr[10];
TT[1]= timestr[11];
CTimetime(年,月,日,0,0,0);
从上面可以明显看出,使用sscanf()函数有优势。
二。将CTIme转换为CString的方法:
CTime TMS can = CTime::GetCurrentTime();
CString szTime = tmScan。格式(“‘% Y-% M-% d % H:% M:% S ' ”);
产生的日期时间字符串基于”2006-11-27 23:30:59″格式。这样方便吗?
//获取CTime中的日期
CString cstrDate = tmScan。格式(“% Y-% m-% d ”);
//获取CTime中的时间
CString cstrTime = tmScan。格式(“% H:% M-% S ”);
Sprintf还有一个很好的表亲:strftime,专门用于格式化时间字符串。它的用法和她表姐很像,也是很多格式控制器。只是毕竟小姑娘谨慎,还得让打电话的人指定缓冲区的最大长度,大概是为了出了事可以推卸责任。这里有一个例子:
time _ t t = time(0);
//产生”YYYY-MM-DD hh:MM:ss ”字符串的格式。
char s[32];
strftime(s,sizeof(s),“% Y-% M-% d % H:% M:% S ”,本地时间(& ampt));
Sprintf也能在MFC: CString::Format中找到知音,strftime自然也有她在MFC: CTime::Format中的同道好友。这对赞助面向对象,用来写的代码更优雅。
三。字符串被转换为数字类型
会串”20.0E6 & # 8243转换成数字
1、sscanf(“20.0e5 & # 8243,”% d & # 8221,& ampx);
2、atof(“20.0E6 & # 8221);
很多人在这个“家族”中使用atoi()、atof()等函数。它们使用方便,但有一个重要的缺点:
转换失败后,转换字符串”0″都返回0,这使得一致性错误检查几乎不可能。为了完整起见,我们给出一小段代码:
代码:
——————————————————————————–
const char * str _ int = & # 8220777”;
const char * str _ float = & # 8220333.3”;
int I = atoi(str _ int);
float f = atof(str _ float);
——————————————————————————–
更好的方法:
稍微复杂和一致一点的方法是使用sscanf()
代码:
——————————————————————————–
const char * str _ int = & # 8220777”;
const char * str _ float = & # 8220333.3”;
int I;
浮动f;
if(EOF == sscanf(str_int,“% d & # 8221,& ampi)){
//错误
}
if(EOF == sscanf(str_float,“% f & # 8221,& ampf)){
//错误
}
——————————————————————————–
因为sscanf()采用const char*参数,所以可以直接使用CString:
因为sscanf()使用const char*作为参数,所以可以直接使用CString作为参数:
代码:
——————————————————————————–
CString str _ int(“777”);
if(EOF == sscanf(str_int,“% d & # 8221,& ampi)){
//错误
}
——————————————————————————–
小心格式描述符(如本例”% d & # 8221)。Sscanf()无法检查格式描述符是否与传递的变量类型相匹配。如果不匹配,会得到意想不到的结果。还要注意,sscanf()可以一次从一个字符串中提取一个或多个数值。
++方法
以下示例显示了使用标准C++类来完成此任务的模板函数。
代码:
——————————————————————————–
四。int char * float和CStringCovernt
1 .int & lt->CString
1)int->;CString
int n = 1;
CString字符串;
海峡。格式(“% d & # 8221,n);
2)CString->(同Internationalorganizations)国际组织
CString str = & # 82201”;
int n = atoi(str。get buffer(0));
2。char*和CString
1)char *->CString
char SZ[128];
CString字符串;
海峡。格式(“% s & # 8221,SZ);
2)CString->字符*
CString字符串;
//int nLength = str。GetLength();
char* sz = str。get buffer(0);
3。float & lt->CString
1)浮动->;CString
浮点f = 0.0
CString字符串;
海峡。格式(“% f & # 8221,f);
2)CString->漂浮物
CString str = & # 82200.0”;
float f = atof(str。get buffer(0));