#include <stdio.h>
#include <assert.h> size_t mstrlen(const char *s)
{
assert(s != NULL); if (s == NULL) {
return 0;
} size_t ret = 0; while (*s != '\0') {
++ret;
++s;
} return ret;
} void test_strlen()
{
char a[] = "hello,world"; printf("%lu\n", mstrlen(a)); } char *mstrcpy(char *dst, const char *src)
{
assert(src != NULL);//若条件不满足(为假),则终止该函数;
assert(dst != NULL);//同上. char *pdst = dst;
//当函数执行到字符串的末尾时‘ \0’,条件不满足则结束函数 返回“ pdst”.
while (*dst = *src) {
++dst;
++src;
}
/* RTFSD: read the fuck source code */
/* hello,world'\0' = '\0' = 0*/ return pdst;//最后返回的值,结果为指针dst的首地址;
} void test_strcpy() //??????
{
char d[4] = {0};
char s[] = "hello";
mstrcpy(d,s);
printf("strcpy:d:%s\n", mstrcpy(d, s));//结果为strcpy:d:hello
printf("%c\n",d[5]);//结果为何还为“"o" ?????
} char *mstrncpy(char *dest, const char *src, size_t n)
{
assert(dest != NULL);
assert(src != NULL); char *pdest = dest;
//将指针src所指的内容一步步复制给指针dest所指的地址内;
while (n--) {
if (*src != '\0') {
*dest++ = *src++;
}else {
*dest++ = '\0';//字符串的结束标志复制给指针dest所指的地址,此时复制也就结束了;
}
} return pdest;//返回指针dest的首地址;
} void test_strncpy()
{
char d[30] = "abcdefghijk";
char s[10] = "hello";
mstrncpy(d,s,8);
printf("strncpy:%s\n", mstrncpy(d, s, 8));//结果为strncpy:hello
printf("%c,%c,%c\n",d[6],d[7],d[11]);//结果为空白,因为复制过去的没有内容。。
} /*将*src的前n个字符赋给*dest的末尾*/
char *mstrncat(char *dest, const char *src, size_t n)
{
assert(dest != NULL);
assert(src != NULL); char *pdest = dest; while (*dest != '\0') {
++dest;//指针所指的地址依次移动;
} while (n--) {
if (*src != '\0') {
*dest++ = *src++;//将指针src所指地址的值赋给指针dest所指的地址,同时向右移动一个地址;
}else {
*dest++ = '\0';
}
} return pdest;
}
/*将*src的前n个字节的内容拷贝给*dest,不会因为字符串的结束而结束*/
void *mmemcpy(void *dest, const void *src, size_t n)
{
char *pdest = (char *)dest;
const char *psrc = (char *)src; while (n--) {/*先判断n,再进行自减*/
*pdest++ = *psrc++;
} return dest;
} void test_memcpy()
{
char a[] = {0x11, 0x22, 0x33, 0x44, 0x55}; int b = 0;
mmemcpy(&b, a, sizeof(b)); printf("b = %#x", b);//结果为0x44332211,按照小端模式排列
printf("b = %x", b);//结果为44332211,
} /* s:hello,world accpet: abcde *///在字符串*s中找到最先含有*accept的任一字符的位置并返回,若没有则返回空指针
char *mstrpbrk(const char *s, const char *accept)
{
assert(s != NULL);
assert(accept != NULL); const char *t = NULL;//将空指针赋值给*t;
//先在对s进行一层循环 ,后在对accept进行一层循环;
for (; *s != '\0'; ++s) {
for (t = accept; *t != '\0'; ++t) {
if (*s == *t) {
return (char *)s;//找到了 就将他的地址返回出来,不再执行后面的语句了;
}
}
} return NULL;//没找到,此时返回空指针;
}
void test_strpbrk(void)
{
char s[] = "hello,world";
char a[] = "abcde"; printf("found = %c\n", *mstrpbrk(s, a));//结果为found=e;
}
//在字符串haystack中查找字符串needle 若找到就返回出来haystack找到的字符串后所以内容, 若没有则返回空指针;
char *mstrstr(const char *haystack, const char *needle)
{
assert(haystack != NULL);
assert(needle != NULL); const char *ph = NULL;
const char *pn = NULL; for (; *haystack != '\0'; ++haystack) // '0' != '\0' == 0
{
for (ph = haystack, pn = needle; (*pn != '\0') &&
(*ph == *pn); ++ph, ++pn) {
;
}
/* pn 到达字符结尾*/
if (*pn == '\0') {
return (char *)haystack;//返回此时的haystack及后面所跟的所有内容;
}
} return NULL;
} void test_strstr()
{
char a[] = "hello,worldxwordyfff";
char b[] = "word"; printf("strstr:%s\n", mstrstr(a, b));//strstr:wordyfff }
/*字符串反转*/
char *strreverse(char *s)
{
assert(s != NULL);//断言 char *head = s;
char *tail = s;
char c = 0; while (*(tail+1) != '\0') {
++tail;//将指针tail的地址移动到最高位;
} for (; head < tail; ++head, --tail) {
c = *head;/*将指针head指的内容和指针tail指向的内容进行交换*/
*head = *tail;
*tail = c;
} return s;//为何要返回s???
} void test_strreverse()
{
char a[] = "hello,world"; printf("strreverse:%s\n", strreverse(a));//结果为strreverse:dlrow,olleh }
// "1234" --> 1234 /*将字符型转换成整型*/
int matoi(const char *s)
{
if (s == NULL) {
return 0;/*若为空指针则返回0,并跳出这个函数*/
} int ret = 0; int n = 0; while (*s != '\0') {
n = *s - '0';/*将字符型转化成整形*/
ret = ret * 10 + n;
++s;/*向高位自行移动一位地址*/
} return ret;/*返回得到的整型数*/
} void test_atoi()
{
printf("atoi:%d\n", matoi("1234567"));
} /* num = 1234567, buf="1234567" *//*将整型转换成字符型,buf是转换的指针,num被转换成的数组,base转换进制类型*/
char *mitoa(char *buf, int num, int base)
{
assert(buf != NULL); char tab[] = "0123456789abcdef"; char *pb = buf; while (num != 0) {
*pb++ = tab[num % base];/*不断的除进制数进行取余*/
num /= base;//等价于num=num/baes
}
*pa=\0;
#if DEBUG
printf("buf=%s\n", buf);
#endif
return strreverse(buf);//此处是将buf里面的内容进行反转
} void test_itoa()
{
char buf[20] = {0};
mitoa(buf, 0xf0, 2);
printf("itoa:%s\n", buf);//结果为itoa:11110000 (如何输出检测到停止位)?
} /*8月6号的任务题目*/
// fmt: "abc%co%dm%x%s%%"// ???没弄懂
int msprintf(char *buf, const char *fmt, ...)
{
int ret = 0;
va_list ap;//你的类型列表
va_start(ap, fmt);//初始化你的ap链表 enum {OFF, ON} flag = OFF;//OFF=0;ON=1 //printf("sizeof(enum)%lu\n", sizeof flag); for (; *fmt != '\0'; ++fmt) {
switch (*fmt) {
case '%':
if (flag == OFF) {
//格式位
flag = ON;
}else {
//普通字符
flag = OFF;
*buf++ = *fmt;
++ret;
}
break;
case 'c':
if (flag == OFF) {
*buf++ = *fmt;
}else{
flag = OFF;
*buf++ = (char)va_arg(ap, int);
}
++ret;
break;
case 'd':
if (flag == OFF) {
*buf++ = *fmt;
++ret;
}else {
flag = OFF;
mitoa(buf, va_arg(ap, int), 10); // "1234"
while (*buf != '\0') {
++buf;
++ret;
}
}
break;
case 'o':
if (flag == OFF) {
*buf++ = *fmt;
++ret;
}else {
flag = OFF;
mitoa(buf, va_arg(ap, int), 8); // "1234"
while (*buf != '\0') {
++buf;
++ret;
}
}
break;
case 'x':
if (flag == OFF) {
*buf++ = *fmt;
++ret;
}else {
flag = OFF;
mitoa(buf, va_arg(ap, int), 16); // "1234"
while (*buf != '\0') {
++buf;
++ret;
}
}
break;
case 's':
if (flag == OFF) {
*buf++ = *fmt;
++ret;
} else {
flag = OFF;
mstrcpy(buf, va_arg(ap, char *));
while (*buf != '\0') {
++buf;
++ret;
}
}
break;
default:
*buf++ = *fmt;
++ret;
break;
}
} va_end(ap); return ret;
} void test_sprintf()
{
char buf[30] = {0}; int n = msprintf(buf, "a%so%dab%c%%%ox%x","hello",1234,'X',
0127, 0x18f); printf("n = %d, buf = %s\n", n, buf);//n=22,buf=ahelloo1234abX%127x18f
} int main()
{
// test_strlen();
// test_strcpy();
.写一个函数判断系统是大端Big_endian还是小端Little_endian
大端格式:字数据的高字节存储在低地址中,而字数据的低字节存放在高地址中
小端格式:字数据的高字节存放在高地址中,而字数据的低字节存放在低地址中 大小端存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,
其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向
的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端。
int i = 1;
char *p = (char*)&i;
if(*p == 1)
printf("Little_endian");
else
printf("Big_endian");
// test_strncpy(); // test_memcpy(); // test_strpbrk(); // test_strstr(); // test_strreverse(); // test_atoi(); test_itoa(); test_sprintf(); return 0; }

str*函数和大小端判断的更多相关文章

  1. CPU大小端判断

    两种方式:1.通过指针         2.通过联合体,联合体里面的数据都是按顺序存储的,而且不论联合体里面有多少数据类型,联合体长度是最长的数据类型的长度.不论初始化多少联合体里面的数据,有效的是最 ...

  2. python判断字符串,str函数isdigit、isdecimal、isnumeric的区别

    s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() ...

  3. Linux中判断大小端的一种方法

    大小端的定义无需赘言,常用的方法有使用联合体和指针法,如: int checkCPU() { union w { int a; char b; }c; c.a = 1; return (c.b == ...

  4. C语言判断大小端的几种方法

    在操作系统中,经常会用到判断大小端,很多面试题中也会经常遇到,以前的时候没有总结过,这里总结一下. 以后用到了就直接可以用了. 所谓的大小端,大致的解释意思就是: [大端模式] CPU对操作数的存放方 ...

  5. 判断PC机大小端

    判断PC机大小端 #include<stdio.h> #include<stdlib.h> int main() { short a = 0x0102; char *p = ( ...

  6. python3 判断大小端的一种方法

    这里用到了array.array('H', [1])来测试大小端,[1]可以转化为十六进制的0x0001,占两位,00位高位, 01位低位,通过第一位就可以判断大小端. 如果是小端,则转化为bytes ...

  7. 经典笔试题:用C写一个函数测试当前机器大小端模式

    “用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...

  8. 判断大小端的方法(java和c++)

    首先我们给出大小端的定义: 小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址. 大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址. 将 ...

  9. c/c++ int,float,short 大小端转换函数

    unsigned int(uint32_t)大小端转换函数 unsigned int BLEndianUint32(unsigned int value) { return ((value & ...

随机推荐

  1. PHP引用传值规范问题

    在我上一篇:  shopnc 商城源码阅读笔记--开篇概述   中,遇到了一个PHP引用传值导致的错误,情况大致如下: 在我查阅PHP官方文档  的中文版的时候   http://php.net/ma ...

  2. 微调Win8.1这台电脑

    从前有个笑话:一位朋友在办公室受到领导教育:“我说小王同志啊,虽然这电脑是你打了报告组织上买给你用的,可是你也不好这么狂妄嘛...”可怜的他只好把图标的名字改为“大家的电脑”. 想必大家已经知道这个笑 ...

  3. Python学习笔记—itertools模块

    这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...

  4. NSCharacterset

    我们在nsstring的分割,查找等操作中,经常会提供两种函数,参数类型分别为NSString 和NSCharacterset,有什么不同呢? NSString 是有序字符串 NSCharacters ...

  5. 正则表达式的秘籍-b

    一. 正则表达式和其他方法的比较 1.我们一般将谓词和正则表达式配合使用,这是最常用的方法. - (BOOL)validateNumber:(NSString *) textString {     ...

  6. Android编程中常用的PopupWindow和Dialog对话框

    注意:PopupWindow组件的使用问题,PopupWindow是一个阻塞对话框,如果你直接在Activity创建的方法中显示它,则会报错:android.view.WindowManager$Ba ...

  7. responsive design

    http://www.chinaz.com/manage/2011/1121/221607.shtml http://alistapart.com/article/responsive-web-des ...

  8. HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

    点我看题目 题意 :两条平行线上分别有两种城市的生存,一条线上是贫穷城市,他们每一座城市都刚好只缺乏一种物资,而另一条线上是富有城市,他们每一座城市刚好只富有一种物资,所以要从富有城市出口到贫穷城市, ...

  9. linux 访问windows共享

    1. windows端建立一个用户user用于共享访问 2. 共享一个目录,设置user可以访问,并在windows系统中确认可以访问 3. linux端创建一个用于挂载共享目录的目录    mkdi ...

  10. QVariant实质 (类似 C#中的装箱拆箱)

    QVariant是一种可以存储不同类型的数据结构,在很多场合这是很有用得为了达到这种目的,可以想象,该对象应该存储对象的类型信息,数据信息以及其他辅助详细考虑用途,这种对象必须支持对不同对象的存储,对 ...