1)将一个字符串中的小写字母变成大写的,如果是大写的则保持不变。如果是字母之外的符号如“,”、“?”等,则去掉这些符号。原型给定void Str_toupper(const char *pIn, char *pOut)。
解决:
void Str_toupper(const char *pIn, char *pOut)
{
unsigned int out_len=0;
if((pIn==NULL)||(pOut==NULL))
{
return;
}
while(*pIn!='\0')
{
if(((*pIn)<='z')&&((*pIn)>='a'))
{
pOut[out_len]=(*pIn)-'a'+'A';
out_len++;
}else if(((*pIn)<='Z')&&((*pIn)>='A'))
{
pOut[out_len]=(*pIn);
out_len++;
}
pIn++;
}
pOut[out_len]='\0';
}
其实如果小写转化成大写的话,STL string里面可以调用泛型算法:
#include <string>
#include <algorithm>
using namespace std;
char IN[20]="abcde78?fAZ";
char *Out=(char *)malloc(strlen(IN)+1);
std::string s(IN,strlen(IN)+1);
transform(s.begin(), s.end(), s.begin(), toupper);
printf("s is%s\n",s);
但是STL不能去掉不是a-z A-Z外的字符;
(2)将字符串中的每一个字符,变成他的下一个字符。大小写不变,如果是z就改成a,如果是Z改成A),其它字符不变,比如,输入为abcf,输出应为bcdg。
void ChangeLetter(const char *pInStr, char *pOutStr)
{
if((pInStr==NULL)||(pOutStr==NULL))
{
return;
}
for (unsigned int i=0;i<strlen(pInStr);i++)
{
if((pInStr[i]<'z'&&pInStr[i]>='a')||(pInStr[i]<'Z'&&pInStr[i]>='A'))
{
pOutStr[i]=pInStr[i]+1;
}else if(pInStr[i]=='z')
{
pOutStr[i]='a';
}else if(pInStr[i]=='Z')
{
pOutStr[i]='A';
}
}
pOutStr[strlen(pInStr)]='\0';
}
大家对这两道面试题有更好的解决办法,欢迎留言交流!