<轉(zhuǎn)載自CSDN,看著寫的都很工整,因此也沒有測試。明天挨個看看,如有問題會加以更正。主要是自己也想用,就轉(zhuǎn)載了過來,望原作者見諒?。?!>
常見C語言面試題之一:字符串代替、字符串轉(zhuǎn)換整數(shù)
#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;
}
//--------字符串轉(zhuǎn)換為整數(shù)
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;
}
//--------整數(shù)轉(zhuǎn)換為字符串
void itoa(int n,char s[])
{
//下面注釋的是原作者的代碼,覺得有問題,
//我修改后
int i,j,sign;
if((sign=n)<0)//記錄符號
n=-n;//使n成為正數(shù)
i=0;
do{
int k=n;
s[i++]=k+'0';//取下一個數(shù)字
}while ((n/=10)>0);//刪除該數(shù)字
if(sign<0)
s[i++]='-';
s[i]='/0';
for(j=i;j>=0;j--)//生成的數(shù)字是逆序的,所以要逆序輸出
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語言面試題之二:浮點(diǎn)數(shù)轉(zhuǎn)換為字符串
#include "stdafx.h"
#include "stdlib.h"
char *F2S(double d, char* str)
{
char str1[40];
int j=0,k,i;
i = (int)d; //浮點(diǎn)數(shù)的整數(shù)部分
//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是復(fù)制到結(jié)果result的掃描指針
//*pc2是掃描source 的輔助指針
//*pc3尋找子串時,為檢查變化中的source是否與子串相等,是指向sub的掃描指針
//找到匹配后,為了復(fù)制到結(jié)果串,是指向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);
//申請結(jié)果串需要的空間
int size = (int)((irep>isub)?(float)strlen(source)/isub*irep+1 :isource );
result = (char*)malloc(size*sizeof(char));
pc1=result;//為pc1依次復(fù)制結(jié)果串的每個字節(jié)作準(zhǔn)備
while(*source !=NULL)
{
//為檢查source與sub是否相等作準(zhǔn)備,為pc2,pc3 賦初值
pc2=source;
pc3=sub;
//出循環(huán)的(任一)條件是:
//*pc2不等于*pc3(與子串不相等)
//*pc2到源串結(jié)尾
//*pc3到源串結(jié)尾(此時,檢查了全部子串,source處與sub相等)
while(*pc2==*pc3 && *pc3!=NULL&& *pc2!=NULL)
{
pc2++;pc3++;
}
//如果找到了子串,進(jìn)行以下處理工作
if(*pc3==NULL)
{
pc3=rep;
//將替代串追加到結(jié)果串
while(*pc3!=NULL)
{
*pc1++ = *pc3++;
}
pc2--;
source=pc2;
//檢查source與sub相等的循環(huán)結(jié)束后
//* pc2 對應(yīng)的位置是在sub 中串結(jié)束符處。該是源串中下一個位置。
//將 source 指向其前面一個字符。
}
else//如果沒找到子串,下面復(fù)制source所指的字節(jié)到結(jié)果串
{
*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) 收藏 舉報(bào)
#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[])
{
//內(nèi)存對齊
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);
//內(nèi)存對齊
//刪除右邊的空格
//用字符指針,則rtrim函數(shù)中無法修改,產(chǎn)生錯誤?。。?br /> //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);//調(diào)用上面的rtrim()函數(shù)
strrev(str);
return str;
}
char *rjust(char* str)
{
int n = strlen(str);
char *dup_str;
dup_str=strdup(str);
rtrim(dup_str);//調(diào)用上面的rtrim()函數(shù)
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;
}
愛華網(wǎng)



