[C Libary Written By Ourself]大家一起來玩玩[1]


CLWBO

話不多說,練練手而已!

大家可以提交自己的代碼,也可以參與別人代碼優劣的評論!

28 个解决方案

#1


我先來

#define ABS(x) ((x>=0)?(x):(-1*x))
char *itoa(int integer, char *buffer, int size)
/*
 * Descripton: convert integer to string
 * 
 * Parameters:
 *             integer - to be converted(decimal)
 *             buffer  - address of buffer used to store result(string)
 *             size    - buffer size(in bytes)
 * Return:
 *             success - string pointer(none-0)
 *             failure - 0
 */
{
int i, j, s1, s2;

s1 = s2 = ABS(integer);
i = integer<0 ? 1 : 0;
for (j=1; s1/=10; j++);
i = i+j;
if (i+1>size) return 0;
buffer[i] = '\0';
for (i--; i>=0; i--)
{
if (i==0 && integer<0)
{
buffer[i] = '-';
break;
}
buffer[i] = s2%10 + '0';
s2 /= 10;
}
return buffer;
}

#2


#define IS_DIGITAL(c) (!(c<'0'||c>'9'))
#define INT32_DIGITALS 10

int atoi(int *integer, char *string)
/*
 * Description: convert string to integer
 *
 * Parameters:
 *              integer - used to output result(ingeter)
 *              string  - to be converted(null-terminated)
 * Return:
 *              success - 0
 *              failure - error code(none-0)
 *                        1 (invalid string)
 *                        2 (invalid size)
 */
{
char *s1, *s2;
int i;

s1 = s2 = string;
if (*s1 == '-') s1++;
for (s2=s1; *s2; s2++)
if (!IS_DIGITAL(*s2)) return 1;
if (s2-s1>INT32_DIGITALS) return 2;

i = 1;
*integer = 0;
do
{
s2--;
*integer = *integer + (*s2-'0')*i;
i *= 10;
}
while(s2!=s1);

if (s1!=string) *integer = 0 - *integer;

return 0;
}

int atoin(int *integer, char *string, int length)
/*
 * Description: convert string(length specified) to integer
 *
 * Parameters:
 *              integer - used to output result(ingeter)
 *              string  - address of string to be converted
 *              length  = length of string
 * Return:
 *              success - 0
 *              failure - error code(none-0)
 */
{
char *str;
int ret;

str = malloc(length+1);
strncpy(str, string, length);
str[length] = '\0';
ret = atoi(integer, str);
free(str);
return ret;
}

#3


我幫UP

#4


個人認為,能不用宏實現,就盡量不要用宏做。 寧可用inline函數。

#5



char *strcpy(char *target, const char *source)
/*
 * Description: copy string to string
 *
 * Parameters:
 *              source  - source string
 *              target  - target string
 * Return:
 *              success - pointer to target string
 *              failure - 0
 */
{
char *t;

t = target;
while (*source != '\0') *target++ = *source++;
return t;
}

char *strncpy(char *target, const char *source, int length)
/*
 * Description: copy string to string
 *
 * Parameters:
 *              source  - source string
 *              target  - address of target string
 *              length  - length of target string
 * Return:
 *              success - pointer to target string
 *              failure - 0
 */
{
char *t;

t = target;
while (*source != '\0' && length)
{
*target++ = *source++
length--;
}
return t;
}

#6


個人認為,能不用宏實現,就盡量不要用宏做。 寧可用inline函數。
================================================================
有道理,有些函數用宏實現,還是有好處的,如直接包含頭文件即可。

還有幾點我需要聲明一下:

1、這個只是大家練練手;
2、並不是要寫C標准庫,而是寫一些函數;
3、請有些說我嘩眾取寵的人,自己寫幾個函數,我相信會有收獲的,而不是只知道說。

#7


…… 純粹路過,不要理我,樓下繼續

#8


ourself -> ourselves /* blush */

#9


個人建議:
1. 局部變量的聲明初始化是一個好習慣
2. 對於傳入指針的有效判斷也是有必要的
3. 另外就是看了樓主的程序收獲很大 准備回去好好努力

#10


知道輪子怎么做的就可以了,
沒必要真的要去做一個吧。

#11


修改: 局部變量的初始化 (去掉聲明)

#12


那些人家標准庫里面不有了嗎?再寫一遍?

#13


程序設計方面,動手也很重要。。。。。。。。。

我也說了,就是練手!

別人的代碼,你能消化,自己寫一遍要比只想那個算法要好的多。

#14


sigh,當年我也積攢了一些程序的,找不到咯……

#15


int strIp2intIp(const char *addr_str)
{
  int ret=0;
  struct in_addr addr;
  char *temip = NULL ;

  temip = (char *)addr_str;

  ret = inet_aton (temip, &addr);
  if (ret <= 0)
    {
      return -1;
    }
   
  return addr.s_addr;

}

#16


但有時候也找不到題目寫啊。

#17


to 樓上:
所以才先試着寫庫里面的函數,好歹有個目標,你說是不是?

希望大家把練手的代碼都帖在這里來。

#18


改成“用匯編實現的庫”……

#19


這個任務 全權交給 刀子完成

完成之后 偶幫你貼出來展示

#20


狗狗說的有道理。。。提供一個方向。。。不如大家寫一個大整數運算庫吧。。。

#21


大家看看有什么問題?

#define int32 int
#define MAX_INT32 2147483647
#define MIN_INT32 (0-2147483648)
#define INT32_DIGITALS 10
#define IS_DIGITAL(c) (!(c<'0'||c>'9'))

struct _int64
{
int32 low;
int32 high;
};
typedef struct _int64 int64_t;
#define int64 int64_t

int atoi64(int64 *integer, char *string)
/*
 * Description: convert string to 64-bits integer
 *
 * Parameters:
 *              integer - address of buffer(int64_t) to store result
 *              string  - to be converted(null-terminated)
 * Return:
 *              success - 0
 *              failure - error code(none-0)
 */
{
char *s1, *s2;
int i, j, k;

s1 = s2 = string;
if (*s1 == '-') s1++;
for (s2=s1; *s2; s2++)
if (!IS_DIGITAL(*s2)) return 1;

if (s2-s1<INT32_DIGITALS) return atoi(integer, string);

i = 1;
integer->low = 0;
integer->high= 0;
do
{
s2--;

calc_carry:
j = ((*s2-'0')*i)/MAX_INT32;
k = ((*s2-'0')*i)%MAX_INT32;

integer->high += j;
if (integer->low+k>MAX_INT32) goto calc_carry;
integer->low +=k;

i *= 10;
}
while(s2!=s1);

if (s1!=string)
{
integer->low  = 0 - integer->low;
integer->high = 0 - integer->high;
}

return 0;
}

int atoi64n(int64 *integer, char *string, int length)
/*
 * Description: convert string(length specified) to 64-bits integer
 *
 * Parameters:
 *              integer - used to store result(64-bits integer)
 *              string  - address of string
 *              length  - length of string to be converted
 * Return:
 *              success - 0
 *              failure - error code(none-0)
 */
{
char *str;
int ret;

str = malloc(length+1);
strncpy(str, string, length);
str[length] = '\0';
ret = atoi64(integer, str);
free(str);
return ret;
}

#22


好主意,小花你怎么想出來的?

PS:上邊的代碼是不是在firefox下寫出來的啊

#23


簡單的測試代碼:
int main()
{
int64 integer;
__int64 *ll;
char str[20] = "-45533434234567";
int ret;

ret = my_atoi64(&integer, str);
if (ret!=0)
{
printf("error code: %d\n", ret);
return(1);
}

printf("structure size: %d\n", sizeof(integer));

ll = (__int64 *)&integer;
printf("64-bits number: %d\n", *ll);

return 0;
}

#24


回復人: lbaby(星稀.月明.風高.宜私奔) 
呵呵,是呀,帖少來后,TAB鍵消失了,不美觀!

#25


更正:
if (s2-s1<INT32_DIGITALS) return atoi(integer, string);
改為:
if (s2-s1<INT32_DIGITALS) return atoi(&(integer->low), string);

#26


to:
 lovessm(紳士亦花心)(這個牛人不太牛) 
firefox在處理xml中的
<![CDATA[
]]>
字段時存在問題

#27


to  lbaby:
please input this in QQ:
/jk

#28


那位有心交流:mail to:zgxgln@coship.com,有好的源碼共享哦!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com