好久没有用c语言写代码,偶然看到一个这样一个上机题!
输入:this is a book
输出:This Is A Book
此题号称华为上机题(华为你弱爆了!)!
我借着这个来复习一下几个字符串函数!
首先,毫无疑问,这种题目遍历一遍字符串是最快的!
void strformat(char* des)
{
if(*des=='\0'||des==NULL)
return;
*des+='A'-'a';
while(*(++des)!='\0')
if(*des==' '&& *(des+1)!='\0')
*(des+1)+='A'-'a';
}
如果,题目要求不能改变原字符串的我们可以使用strcpy函数拷贝一份函数
char* buf=(char*)calloc(strlen(str),sizeof(char));
strcpy(buf,str);
观察题目我们可以知道,英文字符串是以空格为分隔符的.
当我们在控制台宿舍字符串,一旦遇到空格scanf是会自动返回的!
因此类似于C++中stringstream,我们可以使用字符串格式化函数sscanf对字符串进行格式化,取出每一个单词!
void strformat2(char* des,char* src)
{
int len=0;
char* word=(char*)calloc(256,sizeof(char));
sscanf(src,"%s",word);
while(word)
{
len+=strlen(word);
(*word)+='A'-'a';
strcat(des,word);
des[len++]=' ';
sscanf(src+len,"%s",word);
if(len>=strlen(src))
break;
}
des[--len]='\0';
free(word);
}
上面的函数同样能达到目的!但是,这里有一个bug:当src是以空格结尾是,尾巴的空格会被舍去!!
string.h中还有一个函数能够实现我们的要求!strtok!!
char* strtok(char* src,char* delim);
这个函数能够进行字符串分析,将src串中所有的delim替换为'\0',这样src就被分成了若干子串!
void strformat3(char* des,char* src)
{
int len=0;
char* result=NULL;
result=strtok(src," ");//字符分隔将所有的' '替换为'/0'
while(result)
{
len+=strlen(result);
*result+='A'-'a';
strcat(des,result);//取出剩下的
des[len++]=' ';
result=strtok(NULL," ");
}
des[--len]='\0';
}
上面的三种方法毫无疑问,方法一貌似是最适合解决问题的!
sscanf,strtok应该在更有用的场合使用!!