动态内存管理作业

7.模拟实现atoi

#include
long my_atoi(const char* parr)
{
	long number = 0;
	int flag = 1;
	if (NULL == parr)
	{
		printf("parr is NULL");
	}
	while (*parr == ' ')
	{
		parr++;
	}
	if (*parr == '-')
	{
		flag == -1;
		parr++;
	}
	while ((*parr >= '0') && (*parr <= '9'))
	{
		number = number * 10 + *parr - '0';
		parr++;
	}
	return flag * number;
}
int main()
{
	char arr[] = "-1234";
	long ret = my_atoi(arr);
	return 0;
}

#include 使用时包含头文件

atoi:把字符串nptr转换为int。(理解一下就是让字符串变成合法数字)

int main()
{
  int i=0;
  i=atoi("123");
  printf("i=%d\n",i);  // 输出i=123

  i=atoi("123aaa");
  printf("i=%d\n",i);  // 输出i=123,合法数字后的abc被忽略。

  i=atoi("aaa123");
  printf("i=%d\n",i);  // 输出i=0,数字前有字符为非法。

  i=atoi("+123");
  printf("i=%d\n",i);  // 输出i=123,+是合法字符。

  i=atoi("-123");
  printf("i=%d\n",i);  // 输出i=-123,-是合法字符。
}

8.模拟实现strncat

#include 
#include
#include 
#include
 
char *my_strncat(char *dest, const char*src, int count)
{
    char*ret =dest;//留下最初地址,为了之后连接完还能返回

    assert(dest);
    assert(src);//检测NULL

    while(*dest)
    {
        dest++;//运行到dest的末尾'\0'位置,再连接*src所需字符
    }
    while(count&&*src)//当count为0后,便不再进行连接
    {
        *dest++= *src++;//用*src覆盖掉*dest'\0'后字符,达到连接目的
        count--;
    }
    *dest='\0';//结束标志
    return  (char*)ret;
}
 
int main()
{
    char arr[20] = "hello";
    char *p = " bit";       
    printf("%s\n",my_strncat(arr,p,4));
    system("pause");//使停顿
    return 0;
}
  • dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
  • src – 要追加的字符串
  • n – 要追加的最大字符数。

9.模拟实现strncpy

#include 
#include 
#include 
#include 
char * My_strncpy(char * dest, const char *src, size_t n)
{
    assert(dest);
    assert(src);

    char *ret = dest;
    while (n--)
    {
        *dest++ = *src++;
    }
    return ret;
}

int main()
{
    char str1[20] = "123456789";
    char str2[20] = "abcde";
    My_strncpy(str1, str2, 5);
    printf("str1: %s \n", str1);

    system("pause");
    return 0;
}
  • dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
  • src – 要覆盖的字符串
  • n – 要覆盖的最大字符数。

10.找单身狗

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

编写一个函数找出这两个只出现一次的数字。

#include
void bubblesort(int* arr, int n)//先进行冒泡排序,使得相同的数字能够排在一起
{
	int count = n;
	while (count > 0)
	{
		int flag = 0;
		
        //冒泡排序
        for (int i = 1; i < count; ++i)
		{
			if (arr[i - 1] > arr[i])
			{
				int t = arr[i];
				arr[i] = arr[i - 1];
				arr[i - 1] = t;
				flag = 1;
			}
		}


		if (flag = 0)
		{
			break;
		}
		--count;
	}
}
find_single(int* arr, int n)
{
	//如果相邻的两个数相等i+2,如果相邻的两个数不相等i+1
	printf("单身狗为:");
	for (int i = 0; i < n;)
	{
		if (arr[i] == arr[i + 1])//成双了,不是单身狗
		{
			i += 2;//向后移动2个,判断新的数字
		}
		else
		{
			printf("%d ", arr[i]);
			++i;
		}
	}
	printf("\n");
}


int main()
{
	int arr[] = { 17,10,1, 1, 8, 2, 9, 9 ,3, 4, 4, 8, 6, 6, 13, 13,10};
	int n = sizeof(arr) / sizeof(int);
	bubblesort(arr, n);
	find_singledog(arr, n);
	return 0;
}

你可能感兴趣的:(笔记,c语言)