华为的一道比较基础的面试题,就是查找一个字符串中某个子字符串出现的次数,并只考虑最左对齐的情况。
如在"helloejesjhelloejedjshhello"中查找子字符串"hello"出现的次数。
最直接的方法是使用遍历实现。
int string_find( char str[], char substr[] )
{
int i, j, check ,count = 0;
int len = strlen( str ); /*取得字符串长度,不包括'\0'*/
int sublen = strlen( substr );
for( i = 0; i < len; i++ )
{
check = 1; /*检测标记*/
for( j = 0; j + i < len && j < sublen; j++ ) /*逐个字符进行检测,在sublen长度内,一旦出现不同字符便将check置为0*/
{
if( str[i + j] != substr[j] )
{
check = 0;
break;
}
}
if( check == 1 ) /*在sublen长度内的字符都相等*/
{
count++;
i = i + sublen; /*调整检测起始位置*/
}
}
return count;
}
/*********************************************************************
* Author : Samson
* Date : 01/09/2012
* Test platform:
* GNU Linux version 2.6.29.4
* gcc version 4.4.0 20090506 (Red Hat 4.4.0-4) (GCC)
* *******************************************************************/
/* locate a substring */
char * _strstr(char *s1, char *s2){
char c1, c2;
int sublen = _strlen(s2);
c2 = *s2++;
do
{
do
{
c1 = *s1++;
if(0 == c1)
return NULL;
}while(c1 != c2);
}while(_strncmp(s1, s2, sublen));
return --s1;
}
/* locate substring of N characters */
{
char c1, c2;
c2 = *s2++;
do
{
do
{
c1 = *s1++;
if(0 == c1)
{
return NULL;
}
}while(c1 != c2);
}while(_strncmp(s1, s2, n - 1));
return --s1;
}
/* locate substring of N characters and Ignore case*/
{
unsigned char c1, c2;
c2 = *s2++;
(c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;
do
{
do
{
c1 = *s1++;
if(0 == c1)
return NULL;
c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;
}while(c1 != c2);
}while(_strncmp(s1, s2, n - 1) != 0);
return --s1;
}
以上实现中的_strncmp请参照http://blog.csdn.net/yygydjkthh/article/details/7188518中的具体实现
- /*****************************************************************************
- * @COPYRIGHT NOTICE
- * @Copyright (c) 2013, ChenMH
- * @All rights reserved
- * @file : TestCharacter.h
- * @version : ver 1.0
- * @author : ChenMH
- * @date : 2013/5/17 15:04
- * @brief : C语言中,一种从字符串中获取字符所在位置的方法。
- 是在偶然中从一处开源代码里看到,记录之......
- *****************************************************************************/
- #include <string.h>
- int main(int argc, char **argv)
- {
- //计算字符w在字符串string中的位置
- char* string = "Hello world!";
- char c = 'w';
- char* ptr = strchr(string, c);
- int pos = ptr-string;
- if (ptr)
- printf("The character [%c] was found at pos: [%d]\n", c, pos);
- else
- printf("The character was not found\n");
- return 0;
- }
- /**************************************************************************
- * @Copyright (c) 2013, ChenMH, All rights reserved.
- * @file : main.cpp
- * @version : ver 1.0
- * @author : ChenMH
- * @date : 2013/05/17 16:45
- * @brief : 使用strrchr截取字符串
- **************************************************************************/
- #include <cstdio>
- #include <cstring>
- //(C语言)从当前文件的路径中截取文件名,及获取文件名首字母在字符串中的位置
- int main(int argc, char **argv)
- {
- const char* pName = strrchr(*argv,'/');
- if (!pName) pName = strrchr(*argv,'\\');
- if (pName) pName++;
- int pos = pName - *argv;
- printf("file path: [%s]\n", *argv);
- printf("file name: [%s]; pos: [%d]\n", pName, pos);
- return 0;
- }
题目:编一程序,将两个字符串连接起来,不要用strcat函数。
第1种方法:
main()
{
char str1[10]="world!";
char str2[20]="hello ";
strcpy(str2+strlen(str2),str1);
printf("%s",str2);
}
C语言中strcpy,strcmp,strlen,strcat函数原型
今天去文思创新面试,考官问了我一个简单的实现,即:自己编写strcpm的实现,IBM曾经也考过写strcpy原型,这几个函数在面试的时候经常被考到,很具有代表性,突然被问起还真有点措手不及呢。现在记下供大家学习和以后温习:(下面的程序经本人通过)
1、Strcat函数原型如下:
char *strcat(char *strDest, const char *strScr) //将源字符串加const,表明其为输入参数
{
char * address = strDest; //该语句若放在assert之后,编译出错
assert((strDest != NULL) && (strScr != NULL)); //对源地址和目的地址加非0断言
while(*strDest) //是while(*strDest!=’\0’)的简化形式
{ //若使用while(*strDest++),则会出错,因为++是不受循环
strDest++; //约束的。所以要在循环体内++;因为要是*strDest最后指
} //向该字符串的结束标志’\0’。
while(*strDest++ = *strScr++)
{
NULL; //该循环条件内可以用++,
} //此处可以加语句*strDest=’\0’;有无必要?
return address; //为了实现链式操作,将目的地址返回
}
以下是在VC6.0中调试的例子,函数名用strcata代替。
#include <stdio.h>
#include <assert.h>
char *strcata(char *strDest,const char *strScr)
{
char * address = strDest;
assert((strDest != NULL) && (strScr != NULL));
while(*strDest)
{
strDest++;
}
while(*strDest++ = *strScr++)
{
NULL;
}
return address;
}
void main()
{
char str1[100]={"i love"};
char str2[50]={"China"};
printf("%s\n",strcata(str1,str2));
}
2、Strcpy函数原型如下:
char *strcpy(char *strDest, const char *strScr)
{
char *address=strDest;
assert((strDest != NULL) && (strScr != NULL));
while(*strScr) //是while(*strScr != ’\0’)的简化形式;
{
*strDest++ = *strScr++;
}
*strDest = '\0'; //当strScr字符串长度小于原strDest字符串长度
return address; //时,如果没有改语句,就会出错了。
}
以下是在VC6.0中调试的例子,函数名用strcpya代替。
#include <stdio.h>
#include <assert.h>
char *strcpya(char *strDest, const char *strScr)
{
char *address = strDest;
assert((strDest != NULL) && (strScr != NULL));
while(*strScr)
{
*strDest++ = *strScr++;
}
*strDest = '\0';
return address;
}
void main()
{
char str1[100]={"i love"};
char str2[50]={"China"};
printf("%s\n",strcpya(str1,str2));
}
3、Strcmp函数原型如下:
int strcmp (const char *str1,const char *str2)
{
int len = 0;
assert((str1 != '\0') && (str2 != '\0'));
while(*str1 && *str2 && (*str1 == *str2))
{
str1++;
str2++;
}
return *str1-*str2;
}
以下是在VC6.0中调试的例子,函数名用strcmpa代替。
#include <stdio.h>
#include <assert.h>
int strcmpa (const char *str1,const char *str2)
{
int len = 0;
assert((str1 != '\0') && (str2 != '\0'));
while(*str1 && *str2 && (*str1==*str2))
{
str1++;
str2++;
}
return *str1-*str2;
}
void main()
{
char str1[100] = {"i love"};
char str2[50] = {"China "};
printf("%d\n",strcmpa(str1,str2));
}
4、Strlen函数原型如下:
int strlen(const char *str)
{
int len = 0;
assert(str != NULL);
while(*str++)
{
len++;
}
return len;
}
以下是在VC6.0中调试的例子,函数名用strlena代替。
#include <stdio.h>
#include <assert.h>
int strlena(const char *str)
{
int len = 0;
assert(str != NULL);
while(*str++)
{
len++;
}
return len;
}
void main()
{
char str1[100] = {"i love"};
char str2[50] = {"China "};
printf("%d\n",strlena(str1));
}