返回首页   进站必读

0824练习题


1.

strchr,strrchr函数的测试及实现;(提示:学员可参考man手册)1.c

/** 
* @file 1.c
* @brief strchr,strrchr函数的测试及实现
* @author GuoPengyu
* @version 0.1
* @date 2011-09-09
*/
#include <stdio.h>

char * mystrchr(char *s, char c)
{
	while(*s)
	{
		if(*s == c)
			return s;
		s++;
	}

	return NULL;
}

char * mystrrchr(char *s, char c)
{
	int i = 0;

	while(s[i++]);
	while(--i)
	{
		if(s[i] == c)
			return &s[i];
	}

	return NULL;
}

char * mystrrchr2(char *s, char c)
{
	char *p = NULL;

	while(1)
	{
		if(*s == c)
			p = s;
		if(*s == '\0')
			return p;
		s++;
	}
	return NULL;
}

int main(int argc, const char *argv[])
{
	char *s = "hello world!";
	char *tmp;
	if(tmp = mystrchr(s, 'l'))
		puts(tmp);

	if(tmp = mystrrchr(s, 'l'))
		puts(tmp);

	if(tmp = mystrrchr2(s, 'l'))
		puts(tmp);
	return 0;
}

2.

strstr函数的测试及实现;2.c

/** 
* @file 2.c
* @brief strstr函数的测试及实现
* @author GuoPengyu
* @version 0.1
* @date 2011-09-09
*/
#include <stdio.h>
#include <string.h>

char * mystrstr(char *str, char *substr)
{
    while(*str)
    {
        if(strncmp(str, substr, strlen(substr)) == 0)
            return str;
        str++;
    }
    return NULL;
}

int main(int argc, const char *argv[])
{
    char *str = "hello world!";
    char *substr = "or";

    printf("%s\n", mystrstr(str, substr));

    return 0;
}

3.

输入字符串,同时输入帧头和帧尾(可多个字符),将该字符串中合法的帧识别出来。
示例:帧头:1a2b 帧尾:3c4d
输入字串:001a2bssddef3c4d4asf1a2bddaaee343c4d1a2bttt1a2bddd 3c4d3c4d
思路1:3.c

/** 
* @file 3.c
* @brief
* 输入字符串,同时输入帧头和帧尾(可多个字符),将该字符串中合法的帧识别出来。
* 示例:帧头:1a2b 帧尾:3c4d
* 输入字串:001a2bssddef3c4d4asf1a2bddaaee343c4d1a2bttt1a2bddd 3c4d3c4d
* @author GaoJinlong
* @version 0.1
* @date 2011-09-09
*/
#include <stdio.h>
#include <string.h>

int find_str(char *base, char *head, char *tail, char *str[])
{
	int i = 0;
	char *tmp;

	while(*base)
	{
		if(tmp = strstr(base, head))
			str[i++] = tmp + strlen(head);
		else
			return i;

		if(tmp = strstr(base, tail))
		{
			base = tmp + strlen(tail);
			*tmp = '\0';
		}
		else
			return i - 2;
	}

	return i;
}

int main(int argc, const char *argv[])
{
	int num, i;
	char base[200] = "001a2bssddef3c4d4asf1a2bddaaee343c4d1a2bttt1a2bddd3c4d3c4d";
	char *head = "1a2b";
	char *tail = "3c4d";
	char *str[10];

	num = find_str(base, head, tail, str);
	for(i = 0; i < num; i++)
		puts(str[i]);

	return 0;
}

思路2:3_2.c

/** 
* @file 3_2.c
* @brief
* 输入字符串,同时输入帧头和帧尾(可多个字符),将该字符串中合法的帧识别出来。
* 示例:帧头:1a2b 帧尾:3c4d
* 输入字串:001a2bssddef3c4d4asf1a2bddaaee343c4d1a2bttt1a2bddd 3c4d3c4d
* @author GuoPengyu
* @version 0.1
* @date 2011-09-09
*/
#include <stdio.h>
#include <string.h>

#define LEN 128

int main(void)
{
	char *str1 = "1a2b";
	char *str2 = "3c4d";
	char str[LEN];
	char *start, *end, *p;

	fgets(str, LEN, stdin);
	start = end = str;

	do
	{
		start = strstr(start, str1);
		end = strstr(end, str2);

		if (!start || !end)
			break;
		if (end < start)
		{
			end = start + 1;
			continue;
		}
		for(p = start + 4; p < end; p++)
			printf("%c", *p);
		printf("\n");

		start = end = end + 1;
	} while(start < str + strlen(str));

	return 0;
}