<转载自CSDN,看着写的都很工整,因此也没有测试。明天挨个看看,如有问题会加以更正。主要是自己也想用,就转载了过来,望原作者见谅!!!>
常见C语言面试题之一:字符串代替、字符串转换整数
#include "stdafx.h"
using namespace std;
//--------字符替代问题
char* Translate(char* pSrc, const char cFindChar, const char*pReplaceStr, char* pTag)
{
char* p = NULL ;
int lLen = (int)strlen (pReplaceStr) ;
for (p = pSrc; *p!='/0'; p++)
{
if (cFindChar == *p)
{
strcpy(pTag, pReplaceStr) ;
pTag += lLen ;
}
else
{
*pTag++ = *p;
}
}
return pTag;
}
//--------字符串转换为整数
int myAtoi(const char* s){
int result =0;
int flag =1;
int i =0;
while(isspace(s[i]))
i++;
if(s[i] =='-'){
flag = -1;
i++;
}
if(s[i] =='+')
i++;
while(s[i]!= '/0'){
if((s[i] > '9') || (s[i] <'0'))
break;
int j = s[i] - '0';
result = 10 * result + j;
i++;
}
result =result * flag;
returnresult;
}
//--------整数转换为字符串
void itoa(int n,char s[])
{
//下面注释的是原作者的代码,觉得有问题,
//我修改后
int i,j,sign;
if((sign=n)<0)//记录符号
n=-n;//使n成为正数
i=0;
do{
int k=n;
s[i++]=k+'0';//取下一个数字
}while ((n/=10)>0);//删除该数字
if(sign<0)
s[i++]='-';
s[i]='/0';
for(j=i;j>=0;j--)//生成的数字是逆序的,所以要逆序输出
printf("%c",s[j]);
printf("/n");
}
int _tmain(int argc, _TCHAR* argv[])
{
//--------Translate----------
char szSrc[]= "HelloWord!";
char szTag[256]={0};
char szRep[]="(***)";
charresult[256] = {0};
Translate(szSrc,'o',szRep,szTag);
for(unsignedint i=0;i<strlen(szTag);i++) result[i] =szTag[i];
printf("%s/n",szTag);
printf("%s/n",result);
//-----------------------
int i =atoi(" -321");
printf("%d/n",i);
charch[256]={0};
itoa(-23456,ch);
return0;
}
常见C语言面试题之二:浮点数转换为字符串
#include "stdafx.h"
#include "stdlib.h"
char *F2S(double d, char* str)
{
char str1[40];
int j=0,k,i;
i = (int)d; //浮点数的整数部分
//d = d-(int)d;
while(i>0)
{
str1[j++] =i+'0';
i /=10;
}
for(k=0;k<j;k++)
str[k] =str1[j-1-k]; //
str[j++] = '.';
d -= (int)d;
for(i=0;i<10;i++)
{
d *=10;
str[j++] =(int)d+'0';
d -=(int)d;
}
while(str[--j]=='0');
str[++j] ='/0';
return str;
}
int _tmain(int argc, _TCHAR* argv[])
{
double d =365.897003120000;
char str[20];
char *p = F2S(d, str);
printf("%s/n",str);
printf("%s/n",p);
return 0;
}
常见C语言面试题之三:字符串替代
#include "stdafx.h"
#include "string.h"
#include "malloc.h"
char *replace(char *source, char *sub, char *rep)
{
char *result;
//*pc1是复制到结果result的扫描指针
//*pc2是扫描source 的辅助指针
//*pc3寻找子串时,为检查变化中的source是否与子串相等,是指向sub的扫描指针
//找到匹配后,为了复制到结果串,是指向rep的扫描指针
char *pc1,*pc2,*pc3;
int isource, isub, irep;
isource = (int)strlen(source);
isub = (int)strlen(sub);
irep = (int)strlen(rep);
if(*sub==NULL)
returnstrdup(source);
//申请结果串需要的空间
int size = (int)((irep>isub)?(float)strlen(source)/isub*irep+1 :isource );
result = (char*)malloc(size*sizeof(char));
pc1=result;//为pc1依次复制结果串的每个字节作准备
while(*source !=NULL)
{
//为检查source与sub是否相等作准备,为pc2,pc3 赋初值
pc2=source;
pc3=sub;
//出循环的(任一)条件是:
//*pc2不等于*pc3(与子串不相等)
//*pc2到源串结尾
//*pc3到源串结尾(此时,检查了全部子串,source处与sub相等)
while(*pc2==*pc3 && *pc3!=NULL&& *pc2!=NULL)
{
pc2++;pc3++;
}
//如果找到了子串,进行以下处理工作
if(*pc3==NULL)
{
pc3=rep;
//将替代串追加到结果串
while(*pc3!=NULL)
{
*pc1++ = *pc3++;
}
pc2--;
source=pc2;
//检查source与sub相等的循环结束后
//* pc2 对应的位置是在sub 中串结束符处。该是源串中下一个位置。
//将 source 指向其前面一个字符。
}
else//如果没找到子串,下面复制source所指的字节到结果串
{
*pc1++ = *source;
}
source++;//将source向后移一个字符
}
*pc1=NULL;
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
char Source[] = "abbccdfdcdbbdccd";
char Sub[] = "bb";
char Rep[] = "*****";
char *p = replace(Source, Sub, Rep);
printf("Source:%s/n",Source);
printf("Sub:%s/n",Sub);
printf("Rep:%s/n",Rep);
printf("Result:%s/n",p);
return 0;
}
常见C语言面试题之四:删除字符串头尾空格,字符串右对齐
分类: C++ 2008-08-27 15:55 886人阅读 评论(0) 收藏 举报
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct st {
int id;
char ch;
char name[10];
double db;
};
char *rtrim(char *);
char *ltrim(char *);
char *rjust(char *);
int _tmain(int argc, _TCHAR* argv[])
{
//内存对齐
int id;
struct st stu={9,'c',"name",3.14};
char ch;
char name[11];
double db;
printf("sizeof sturct=%d/n",sizeof(structst)); //==24
memcpy(&id,&stu,sizeof(int));
printf("id=%d/n",id);
memcpy(&ch,(char*)&stu+sizeof(int),1);
printf("ch=%c/n",ch);
memcpy(name,(char*)&stu+sizeof(int)+1,10);
printf("name=%s/n",name);
memcpy(&db,(char*)&stu+16,sizeof(double));
printf("db=%lf/n",db);
//内存对齐
//删除右边的空格
//用字符指针,则rtrim函数中无法修改,产生错误!!!
//char*trail_str="AAAAA";
chartrail_str1[]="AAAAA";
printf("Before rtrim():%s/n", trail_str1);
printf("length:%d./n",strlen(trail_str1));
rtrim(trail_str1);
printf("After rtrim():%s/n",trail_str1);
printf("length:%d./n", strlen(trail_str1));
//删除左边的空格
chartrail_str2[]="AAAAA";
ltrim(trail_str2);
printf("After ltrim():%s/n", trail_str2);
printf("length:%d/n", strlen(trail_str2));
//右对齐
char trail_str3[] ="AAAAA";
rjust(trail_str3);
printf("After rjust():%s/n", trail_str3);
printf("length:%d/n",strlen(trail_str3));
return0;
}
char* rtrim(char* str)
{
int n = strlen(str)-1;
while(n>0)
{
if(*(str+n)==' ')
{
*(str+n)='/0';
//str[n]='/0';
n--;
}
else
{
break;
}
}
return str;
}
char *ltrim(char* str)
{
strrev(str);
rtrim(str);//调用上面的rtrim()函数
strrev(str);
return str;
}
char *rjust(char* str)
{
int n = strlen(str);
char *dup_str;
dup_str=strdup(str);
rtrim(dup_str);//调用上面的rtrim()函数
int m = strlen(dup_str);
sprintf(str, "%*.*s",n,m,dup_str);
free(dup_str);
return str;
}
常见C语言面试题之五:两个字符串的最大公共子字符串
#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#include "string.h"
char *maxsubstr(char *str1, char *str2)
{
char *p1, *p2, *q1, *q2, *destp;
char *substr;
int max=0, len;
p1 = str1;
while(*p1!='/0')
{
q1=str2;
while(*q1!='/0')
{
len=0;
p2=p1;
q2=q1;
while((*p2!='/0')&&(*q2!='/0'))
{
if(*p2==*q2)
{
p2++;q2++;len++;
}
else
break;
}
if(len>max)
{
max = len;
destp =p1;
}
q1++;
}
p1++;
}
substr=(char*)malloc(sizeof(char)*max);
strncpy(substr,destp,max);
return substr;
}
int _tmain(int argc, _TCHAR* argv[])
{
char*s1="easderfghjkl";
char *s2="jasdwfghjewserfghjk";
char *sub;
printf("%s/n%s/n",s1,s2);
sub = maxsubstr(s1,s2);
printf("the max sub string is:%s",sub);
return 0;
}