码迷,mamicode.com
首页 > 其他好文 > 详细

第六章 习题

时间:2016-08-16 00:23:43      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

6。1编写一个函数,它在一个字符串中进行搜索,查找所有在一个给定字符集中出现的字符,返回第一个找到的字符位置指针,未找到返回NULL

#include <stdio.h>

char * find_char(char const *source, char const *chars)
{
	char const *sptr = source;
	char const *cptr = chars;

	if (sptr == NULL || cptr == NULL) {
		return NULL;
	}

	while (*sptr != ‘\0‘) {
		cptr = chars;
		while (*cptr != ‘\0‘) {
			if (*cptr == *sptr) {
                   //找到打印source地址 printf("chars:0x%p\n", chars); //返回类型为 char *,此处类型转换一下把char const *转换回来 return (char *)cptr; } cptr++; } sptr++; } return NULL; }

 

#include <stdio.h>
#include "function.h"

int main()
{
	char *source = "ABCDEF";
	char *str1 = "XYZ";
	char *str2 = "XRCQEF";
	char *chars = str1;
	char *ptr = NULL;
        //没有对应的字符
	ptr = find_char(source, chars);
	printf("0x%p\n", ptr);
        //对应的字符C,第三个
	chars = str2;
	ptr = find_char(source, chars);
	printf("0x%p\n", ptr);

	while (1)
		;
	return 0;
}

  执行结果:

技术分享

 

6.2删除字符串中子串部分,将剩下部分前移。

int del_substr(char *str, char const *substr)
{
	if (str == NULL || substr == NULL) {
		return 0;
	}
       //将数组首位赋值给指针数组
	char *source = str;
	char *sub = substr;
	char *tmp = NULL;

	while (*source != ‘\0‘) {
		//将指针重置指向子串首
		sub = substr;
		//使用临时变量进行对比,保持source位置信息不变
		tmp = source;
		//当遇到相同的字符,开始比较之后是否相同
		while (*tmp++ == *sub++) {
			//循环中已经sub++了,到达末尾,证明找到子串,开始前移
			if (*sub == ‘\0‘) {
				//未到达字符串末尾,继续前移
				while (*(tmp + 1) != ‘\0‘) {
					*source = *tmp;
				}
				return 1;
			}
		}
		source++;
	}
	return 0;
}

 

int main()
{
	char *source = "ABCDEF";
	char *str1 = "CGE";
	char *str2 = "CDE";
	int isDel;
        //无子串
	isDel = del_substr(source, str1);
	printf("del_substr: %d\n", isDel);
        //有子串
	isDel = del_substr(source, str2);
	printf("del_substr: %d\n", isDel);

	while (1)
		;
	return 0;
}

执行结果:

技术分享

6.3 编写函数reverse_string,翻转字符串。

void reverse_string(char *string)
{
	//先定义两个指针,一个指向首一个指向末尾
	char *head = string;
	//string本身指向第一位,加上字符串长度后是指向\0后的,所以需要前移,指向最后一个字符
	char *tail = string + strlen(string) - 1;
	char tmp;

	//同一数组内可以进行指针位置对比
	while (head < tail) {
		tmp = *head;
		*head = *tail;
		*tail = tmp;
		head++;
		tail--;
	}
}

int main()
{
	char source[] = "ABCDEF";
	printf("source: %s\n", source);

	reverse_string(source);
	printf("result: %s\n", source);

	return 0;
}

  执行结果:

技术分享

6.4 erato法找质数

void find_primer(int *numbers, int length)
{
        //0 1 不为质数
	numbers[0] = FALSE;
	numbers[1] = FALSE;

	int tmp;
	int loc;
	int index = 2;

	while (index < length) {
        
		tmp = index;
                //大于二的偶数全不是质数,直接跳过
		if (index > 2 && index % 2 == 0) {
			numbers[index] = FALSE;
			index++;
			continue;
		}
                
                //当前头部找到的质数,和后面的数相乘的结果对应的位置全部不是质数。
		while ( (loc = tmp * index) < length) {
			*(numbers + loc) = FALSE;
			tmp++;
		}
		index++;
	}

}

 

int main()
{
	int numbers[10000];
	for (int index = 0; index < 10000; index++) {
		numbers[index] = TRUE;
	}

	find_primer(numbers, 10000);

	for (int index = 0; index < 10000; index++) {
		if (numbers[index]) {
			printf("%-08d", index);
		}
	}

	return 0;
}

  运行结果:

技术分享

技术分享

 

第六章 习题

标签:

原文地址:http://www.cnblogs.com/yangxunwu1992/p/5774722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!