vsprintf参考代码

vsprintf参考代码
vsprintf参考代码

/*

* linux/lib/vsprintf.c

*

* Copyright (C) 1991, 1992 Linus Torvalds

*/

/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */

/*

* Wirzenius wrote this portably, Torvalds fucked it up :-)

*/

#include

#include

#include

#include

#include

#if !defined (CONFIG_PANIC_HANG)

#include

/*cmd_boot.c*/

extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); #endif

#ifdef CONFIG_SYS_64BIT_VSPRINTF

#include

# define NUM_TYPE long long

#else

# define NUM_TYPE long

#define do_div(n, base) ({ \

unsigned int __res; \

__res = ((unsigned NUM_TYPE) n) % base; \

n = ((unsigned NUM_TYPE) n) / base; \

__res; \

})

#endif

#define noinline __attribute__((noinline))

const char hex_asc[] = "0123456789abcdef";

#define hex_asc_lo(x) hex_asc[((x) & 0x0f)]

#define hex_asc_hi(x) hex_asc[((x) & 0xf0) >> 4]

static inline char *pack_hex_byte(char *buf, u8 byte)

{

*buf++ = hex_asc_hi(byte);

*buf++ = hex_asc_lo(byte);

return buf;

}

// 此函数有以下几点值得注意:

// 1、第一个参数中的const。一般在函数的形参中,如果我们只是希望调用者使用该参数,而不会去改变该

// 参数内容(一般是指针指向的内容),则可以声明为const。

// 2、第二个参数。C语言中函数只能有一个返回值,但是有时候我们希望从函数中得到不止一个返回内容怎

// 么办呢?只能通过参数了。一般的参数是用来向函数输入信息的,但是指针型参数可以间接用来从函数

// 输出信息。使用时用户只需传入一个相应的指针,函数中会把需要输出的信息地址传给这个指针,这样

// 在函数调用完成后,用户即可到endp指针处去取函数传出的值了。这就是用参数实现返回值的方式。但是

// 要注意,在函数中千万不可把局部变量的地址传给输出型指针,因为局部变量存在栈里,函数调用结束后

// 即释放了,传出的指针指向的内容是栈上已经被释放的部分,因此是无效的。(PS:高级语言中

// 譬如C#有ref,out关键字,以明确指明该引用为输出型)

// 3、第三个参数base。要注意这个base的机制,本函数中是按照这样的理念来设计的。即如果str中有0x

// 开头且接下来是数字则忽略用户调用时输入的base,强制为16进制。如果str不是上面情况然后才看用户

// 输入的base。用户输入非0则使用用户指定的base,若用户输入0则自动判断是8进制还是10进制。

// 需要强调的是:使用习惯决定理念,理念决定代码逻辑。

// 4、注意if(endp)这里,在输出型参数使用中,函数内首先判断endp是否为NULL,并以此来决定是否输出

// 这个机制来自于一个理念:这个输出参数有可能是用户关注的,也有可能是用户不在意的。这样处理可以

// 给用户自由,即用户如果在意就传一个有效指针过来接收;如果不在意调用时直接给个NULL就行。提供

// 服务但不强迫,这样很好。在OS的API中很多时候都有类似的技巧,请注意体会。unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)

{

unsigned long result = 0,value;

// 对于base,首先如果*cp以0x开头且下来是数字,则一定为16进制。

// 然后如果用户指定了一个非0的进制,则遵循用户输入的进制。如果用户输入了0进制,则根据是否0开头来

// 确定是8进制还是10进制

if (*cp == '0') {

cp++;

if ((*cp == 'x') && isxdigit(cp[1])) {

base = 16; // 如果cp是0x开头的,下面一个又是数字,那么base 一定为16.此时即使

cp++; // 用户输入了一个base,也忽略这个base而强制其为16

}

if (!base) {

base = 8; // 如果用户输入base为0,cp是0开头,接下来不是x,} // 那么强制为8进制

}

if (!base) {

base = 10; // 如果用户输入base为0,cp是非0开头,则使用10进制。

}

// while循环里value

// 数字的字母。这个字母的范围取决于base,譬如如果是16进制那么f也算是数字。而如果是8进制那么

// 9都不算是数字了。因此解析结束的范围只能和base比较来限定。

while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)

? toupper(*cp) : *cp)-'A'+10) < base) {

result = result*base + value;

cp++;

}

if (endp) // 此处if判断的作用是:用户在使用这个函数时,如果不关心endp则可以直接使用

*endp = (char *)cp; // null,而不必担心程序运行会出错。这种处理技巧很实用,用户可以

return result; // 自行决定是否使用这个函数提供的参数式返回值。

}

long simple_strtol(const char *cp,char **endp,unsigned int base)

{

if(*cp=='-')

return -simple_strtoul(cp+1,endp,base);

return simple_strtoul(cp,endp,base);

}

// 这个函数中需要注意的是switch case中的一个特性:case中如果没有break,那么从前往后

// 第一个匹配的case项,之后每一个项目(不管case是否匹配)都会完全执行,直到遇到break

// 以前只知道没有break会延续下去,还以为延续的下面还需要case匹配才能执行。

int ustrtoul(const char *cp, char **endp, unsigned int base)

{

unsigned long result = simple_strtoul(cp, endp, base);

switch (**endp) {

case 'G' :

result *= 1024;

/* fall through */

case 'M':

result *= 1024;

/* fall through */

case 'K':

case 'k':

result *= 1024;

if ((*endp)[1] == 'i') {

if ((*endp)[2] == 'B')

(*endp) += 3;

else

(*endp) += 2;

}

}

return result;

}

#ifdef CONFIG_SYS_64BIT_STRTOUL

unsigned long long simple_strtoull (const char *cp, char **endp, unsigned int base) {

unsigned long long result = 0, value;

if (*cp == '0') {

cp++;

if ((*cp == 'x') && isxdigit (cp[1])) {

base = 16;

cp++;

}

if (!base) {

base = 8;

}

}

if (!base) {

base = 10;

}

while (isxdigit (*cp) && (value = isdigit (*cp)

? *cp - '0'

: (islower (*cp) ? toupper (*cp) : *cp) - 'A' + 10) < base) {

result = result * base + value;

cp++;

}

if (endp)

*endp = (char *) cp;

return result;

}

#endif /* CONFIG_SYS_64BIT_STRTOUL */

/* we use this so that we can do without the ctype library */

#define is_digit(c) ((c) >= '0' && (c) <= '9')

static int skip_atoi(const char **s)

{

int i=0;

while (is_digit(**s))

i = i*10 + *((*s)++) - '0';

return i;

}

/* Decimal conversion is by far the most typical, and is used

* for /proc and /sys data. This directly impacts e.g. top performance

* with many processes running. We optimize it for speed

* using code from

* https://www.360docs.net/doc/ce17659434.html,/~jones/bcd/decimal.html

* (with permission from the author, Douglas W. Jones). */

/* Formats correctly any integer in [0,99999].

* Outputs from one to five digits depending on input.

* On i386 gcc 4.1.2 -O2: ~250 bytes of code. */

// 把q按照十进制格式化成字符串,然后依次存入buf中。注意q的// 十进制最低位在buf[0]中。例如q=1234时,buf[0]=4,buf[3]=1

// 其实用除非也可以很容易得到结果,但是除法太耗周期,效率低// 这里的算法实际上是高效优化后的代码

// 使用范围为0

{

unsigned d3, d2, d1, d0;

d1 = (q>>4) & 0xf;

d2 = (q>>8) & 0xf;

d3 = (q>>12);

d0 = 6*(d3 + d2 + d1) + (q & 0xf);

q = (d0 * 0xcd) >> 11;

d0 = d0 - 10*q;

*buf++ = d0 + '0'; /* least significant digit */

d1 = q + 9*d3 + 5*d2 + d1;

if (d1 != 0) {

q = (d1 * 0xcd) >> 11;

d1 = d1 - 10*q;

*buf++ = d1 + '0'; /* next digit */

d2 = q + 2*d2;

if ((d2 != 0) || (d3 != 0)) {

q = (d2 * 0xd) >> 7;

d2 = d2 - 10*q;

*buf++ = d2 + '0'; /* next digit */

d3 = q + 4*d3;

if (d3 != 0) {

q = (d3 * 0xcd) >> 11;

d3 = d3 - 10*q;

*buf++ = d3 + '0'; /* next digit */

if (q != 0)

*buf++ = q + '0'; /* most sign. digit */

}

}

}

return buf;

}

/* Same with if's removed. Always emits five digits */

// 这里是个5位的整数适用的方法

static char* put_dec_full(char *buf, unsigned q)

{

/* BTW, if q is in [0,9999], 8-bit ints will be enough, */

/* but anyway, gcc produces better code with full-sized ints */

unsigned d3, d2, d1, d0;

d1 = (q>>4) & 0xf;

d2 = (q>>8) & 0xf;

d3 = (q>>12);

/*

* Possible ways to approx. divide by 10

* gcc -O2 replaces multiply with shifts and adds

* (x * 0xcd) >> 11: 11001101 - shorter code than * 0x67 (on i386)

* (x * 0x67) >> 10: 1100111

* (x * 0x34) >> 9: 110100 - same

* (x * 0x1a) >> 8: 11010 - same

* (x * 0x0d) >> 7: 1101 - same, shortest code (on i386)

*/

d0 = 6*(d3 + d2 + d1) + (q & 0xf);

q = (d0 * 0xcd) >> 11;

d0 = d0 - 10*q;

*buf++ = d0 + '0';

d1 = q + 9*d3 + 5*d2 + d1;

q = (d1 * 0xcd) >> 11;

d1 = d1 - 10*q;

*buf++ = d1 + '0';

d2 = q + 2*d2;

q = (d2 * 0xd) >> 7;

d2 = d2 - 10*q;

*buf++ = d2 + '0';

d3 = q + 4*d3;

q = (d3 * 0xcd) >> 11; /* - shorter code */

/* q = (d3 * 0x67) >> 10; - would also work */

d3 = d3 - 10*q;

*buf++ = d3 + '0';

*buf++ = q + '0';

return buf;

}

/* No inlining helps gcc to use registers better */

static noinline char* put_dec(char *buf, unsigned NUM_TYPE num)

{

while (1) {

unsigned rem;

if (num < 100000)

return put_dec_trunc(buf, num);

rem = do_div(num, 100000);

buf = put_dec_full(buf, rem);

}

}

#define ZEROPAD 1 /* pad with zero 输出前补0填充满宽度*/

#define SIGN 2 /* unsigned/signed long 有符号数,默认为无符号*/

#define PLUS 4 /* show plus 在数字前显示+-号表示正负*/

#define SPACE 8 /* space if plus 输出为正时用空格,为负时用负号*/

#define LEFT 16 /* left justified 左对齐,右边填充空格*/

#define SMALL 32 /* Must be 32 == 0x20 字母为小写*/

#define SPECIAL 64 /* 0x 即在type为o x X时前面加上0 0x 0X */

// 格式化数字num到buf中

static char *number(char *buf, unsigned NUM_TYPE num, int base, int size, int precision, int type)

{

/* we are called with base 8, 10 or 16, only, thus don't need "G..." */

static const char digits[16] = "0123456789ABCDEF"; /* "GHIJKLMNOPQRSTUVWXYZ"; */

char tmp[66];

char sign;

char locase;

int need_pfx = ((type & SPECIAL) && base != 10);

int i;

/* locase = 0 or 0x20. ORing digits or letters with 'locase'

* produces same digits or (maybe lowercased) letters */

locase = (type & SMALL);

if (type & LEFT)

type &= ~ZEROPAD;

sign = 0;

if (type & SIGN) {

if ((signed NUM_TYPE) num < 0) {

sign = '-';

num = - (signed NUM_TYPE) num;

size--;

} else if (type & PLUS) {

sign = '+';

size--;

} else if (type & SPACE) {

sign = ' ';

size--;

}

}

if (need_pfx) {

size--;

if (base == 16)

size--;

}

/* generate full string in tmp[], in reverse order */

i = 0;

if (num == 0)

tmp[i++] = '0';

/* Generic code, for any base:

else do {

tmp[i++] = (digits[do_div(num,base)] | locase);

} while (num != 0);

*/

else if (base != 10) { /* 8 or 16 */

int mask = base - 1;

int shift = 3;

if (base == 16) shift = 4;

do {

tmp[i++] = (digits[((unsigned char)num) & mask] | locase);

num >>= shift;

} while (num);

} else { /* base 10 */

i = put_dec(tmp, num) - tmp;

}

/* printing 100 using %2d gives "100", not "00" */

if (i > precision)

precision = i;

/* leading space padding */

size -= precision;

if (!(type & (ZEROPAD+LEFT)))

while(--size >= 0)

*buf++ = ' ';

/* sign */

if (sign)

*buf++ = sign;

/* "0x" / "0" prefix */

if (need_pfx) {

*buf++ = '0';

if (base == 16)

*buf++ = ('X' | locase);

}

/* zero or space padding */

if (!(type & LEFT)) {

char c = (type & ZEROPAD) ? '0' : ' ';

while (--size >= 0)

*buf++ = c;

}

/* hmm even more zero padding? */

while (i <= --precision)

*buf++ = '0';

/* actual digits of result */

while (--i >= 0)

*buf++ = tmp[i];

/* trailing space padding */

while (--size >= 0)

*buf++ = ' ';

return buf;

}

// 格式化字符串s到buf中

static char *string(char *buf, char *s, int field_width, int precision, int flags)

{

int len, i;

if (s == 0)

s = "";

len = strnlen(s, precision);

if (!(flags & LEFT))

while (len < field_width--)

*buf++ = ' ';

for (i = 0; i < len; ++i)

*buf++ = *s++;

while (len < field_width--)

*buf++ = ' ';

return buf;

}

#ifdef CONFIG_CMD_NET

// 格式化addr指向的数字格式的u8数组装着的mac地址到buf中,用来打印static char *mac_address_string(char *buf, u8 *addr, int field_width,

int precision, int flags)

{

char mac_addr[6 * 3]; /* (6 * 2 hex digits), 5 colons and trailing zero */

char *p = mac_addr;

int i;

for (i = 0; i < 6; i++) {

p = pack_hex_byte(p, addr[i]);

if (!(flags & SPECIAL) && i != 5)

*p++ = ':';

}

*p = '\0';

return string(buf, mac_addr, field_width, precision, flags & ~SPECIAL); }

// 格式化ipv6的IP地址到buf中,源IP地址为u8数组

static char *ip6_addr_string(char *buf, u8 *addr, int field_width,

int precision, int flags)

{

char ip6_addr[8 * 5]; /* (8 * 4 hex digits), 7 colons and trailing zero */ char *p = ip6_addr;

int i;

for (i = 0; i < 8; i++) {

p = pack_hex_byte(p, addr[2 * i]);

p = pack_hex_byte(p, addr[2 * i + 1]);

if (!(flags & SPECIAL) && i != 7)

*p++ = ':';

}

*p = '\0';

return string(buf, ip6_addr, field_width, precision, flags & ~SPECIAL); }

// 格式化ipv4的IP地址到buf中

static char *ip4_addr_string(char *buf, u8 *addr, int field_width,

int precision, int flags)

{

char ip4_addr[4 * 4]; /* (4 * 3 decimal digits), 3 dots and trailing zero */ char temp[3]; /* hold each IP quad in reverse order */

char *p = ip4_addr;

int i, digits;

for (i = 0; i < 4; i++) {

digits = put_dec_trunc(temp, addr[i]) - temp;

/* reverse the digits in the quad */

while (digits--)

*p++ = temp[digits];

if (i != 3)

*p++ = '.';

}

*p = '\0';

return string(buf, ip4_addr, field_width, precision, flags & ~SPECIAL);

}

#endif

/*

* Show a '%p' thing. A kernel extension is that the '%p' is followed

* by an extra set of alphanumeric characters that are extended format

* specifiers.

*

* Right now we handle:

*

* - 'M' For a 6-byte MAC address, it prints the address in the

* usual colon-separated hex notation

* - 'I' [46] for IPv4/IPv6 addresses printed in the usual way (dot-separated

* decimal for v4 and colon separated network-order 16 bit hex for v6)

* - 'i' [46] for 'raw' IPv4/IPv6 addresses, IPv6 omits the colons, IPv4 is

* currently the same

*

* Note: The difference between 'S' and 'F' is that on ia64 and ppc64

* function pointers are really function descriptors, which contain a

* pointer to the real address.

*/

static char *pointer(const char *fmt, char *buf, void *ptr, int field_width, int precision, int flags) {

if (!ptr)

return string(buf, "(null)", field_width, precision, flags);

#ifdef CONFIG_CMD_NET

switch (*fmt) {

case 'm':

flags |= SPECIAL;

/* Fallthrough */

case 'M':

return mac_address_string(buf, ptr, field_width, precision, flags);

case 'i':

flags |= SPECIAL;

/* Fallthrough */

case 'I':

if (fmt[1] == '6')

return ip6_addr_string(buf, ptr, field_width, precision, flags);

if (fmt[1] == '4')

return ip4_addr_string(buf, ptr, field_width, precision, flags);

flags &= ~SPECIAL;

break;

}

#endif

flags |= SMALL;

if (field_width == -1) {

field_width = 2*sizeof(void *);

flags |= ZEROPAD;

}

return number(buf, (unsigned long) ptr, 16, field_width, precision, flags); }

/**

* vsprintf - Format a string and place it in a buffer

* @buf: The buffer to place the result into

* @fmt: The format string to use

* @args: Arguments for the format string

*

* This function follows C99 vsprintf, but has some extensions:

* %pS output the name of a text symbol

* %pF output the name of a function pointer

* %pR output the address range in a struct resource

*

* The function returns the number of characters written

* into @buf.

*

* Call this function if you are already dealing with a va_list.

* You probably want sprintf() instead.

*/

int vsprintf(char *buf, const char *fmt, va_list args)

{

unsigned NUM_TYPE num;

int base;

char *str;

int flags; /* flags to number() */

int field_width; /* width of output field */

int precision; /* min. # of digits for integers; max 小数点后位数

number of chars for from string */

int qualifier; /* 'h', 'l', or 'L' for integer fields */

/* 'z' support added 23/7/1999 S.H. */

/* 'z' changed to 'Z' --davidm 1/25/99 */

/* 't' added for ptrdiff_t */

str = buf;

for (; *fmt ; ++fmt) {

if (*fmt != '%') {

*str++ = *fmt;

continue;

}

/* process flags */

flags = 0;

repeat:

++fmt; /* this also skips first '%' */

switch (*fmt) {

case '-': flags |= LEFT; goto repeat;

case '+': flags |= PLUS; goto repeat;

case ' ': flags |= SPACE; goto repeat;

case '#': flags |= SPECIAL; goto repeat;

case '0': flags |= ZEROPAD; goto repeat;

}

/* get field width */

field_width = -1;

if (is_digit(*fmt)) // 如果是数字,则计算连续是数字的字母,将其转为int即是

field_width = skip_atoi(&fmt);

else if (*fmt == '*') { // *表示格式列表中,下一个参数还是width

++fmt;

/* it's the next argument */

field_width = va_arg(args, int);

if (field_width < 0) {

field_width = -field_width;

flags |= LEFT;

}

}

/* get the precision */

precision = -1;

if (*fmt == '.') {

++fmt;

if (is_digit(*fmt))

precision = skip_atoi(&fmt);

else if (*fmt == '*') { // *表示下一个格式参数还是precision

++fmt;

/* it's the next argument */

precision = va_arg(args, int);

}

if (precision < 0)

precision = 0;

}

/* get the conversion qualifier */

qualifier = -1;

if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || // h 代表int

*fmt == 'Z' || *fmt == 'z' || *fmt == 't') { // l 代表long / float

qualifier = *fmt; // L 代表long long / double

++fmt; // Z /z 代表size_t

if (qualifier == 'l' && *fmt == 'l') { // t 代表ptrdiff_t

qualifier = 'L';

++fmt;

}

}

/* default base */

base = 10;

switch (*fmt) {

case 'c': // c 打印单个字符

if (!(flags & LEFT))

while (--field_width > 0)

*str++ = ' ';

*str++ = (unsigned char) va_arg(args, int);

while (--field_width > 0)

*str++ = ' ';

continue;

case 's': // s 打印字符串

str = string(str, va_arg(args, char *), field_width, precision, flags);

continue;

case 'p': // p 打印指针,即该指针变量本身地址,pm或者pM 打印MAC地址,

str = pointer(fmt+1, str, // pi4(pI4)打印IPV4地址,pi6(PI6)打印IPV6地址

va_arg(args, void *),

field_width, precision, flags);

/* Skip all alphanumeric pointer suffixes */

while (isalnum(fmt[1]))

fmt++;

continue;

case 'n':

if (qualifier == 'l') {

long * ip = va_arg(args, long *);

*ip = (str - buf); // 将已写字符的个数放入%n相连的指针内。这个指针是int

} else { // 还是long取决于qualifier

int * ip = va_arg(args, int *);

*ip = (str - buf);

}

continue;

case '%':

*str++ = '%';

continue;

/* integer number formats - set up the flags and "break" */

case 'o':

base = 8; // o 8进制无符号

break;

case 'x':

flags |= SMALL; // x 无符号16进制,且a~f为小写

case 'X':

base = 16; // X 无符号16进制,且A~F为大写

break;

case 'd':

case 'i':

flags |= SIGN; // d,i 有符号十进制整数

case 'u': // u 无符号十进制整数

break;

default: // f(浮点数),e(科学计数法表示的浮点数)这些这里没做支持

*str++ = '%';

if (*fmt)

*str++ = *fmt;

else

--fmt;

continue;

}

#ifdef CONFIG_SYS_64BIT_VSPRINTF

if (qualifier == 'L') /* "quad" for 64 bit variables */

num = va_arg(args, unsigned long long);

else

#endif

if (qualifier == 'l') {

num = va_arg(args, unsigned long);

if (flags & SIGN)

num = (signed long) num;

} else if (qualifier == 'Z' || qualifier == 'z') {

num = va_arg(args, size_t);

} else if (qualifier == 't') {

num = va_arg(args, ptrdiff_t);

} else if (qualifier == 'h') {

num = (unsigned short) va_arg(args, int);

if (flags & SIGN)

num = (signed short) num;

} else {

num = va_arg(args, unsigned int);

if (flags & SIGN)

num = (signed int) num;

}

str = number(str, num, base, field_width, precision, flags);

}

*str = '\0';

return str-buf;

}

/**

* sprintf - Format a string and place it in a buffer

* @buf: The buffer to place the result into

* @fmt: The format string to use

* @...: Arguments for the format string

*

* The function returns the number of characters written

* into @buf.

*

* See the vsprintf() documentation for format string extensions over C99. */

int sprintf(char * buf, const char *fmt, ...)

{

va_list args;

int i;

va_start(args, fmt);

i=vsprintf(buf,fmt,args);

va_end(args);

return i;

}

void panic(const char *fmt, ...)

{

va_list args;

va_start(args, fmt);

vprintf(fmt, args);

putc('\n');

va_end(args);

#if defined (CONFIG_PANIC_HANG)

hang();

#else

udelay (100000); /* allow messages to go out */ do_reset (NULL, 0, 0, NULL);

#endif

}

顺序表c语言的程序代码

//----------------------------线性表的动态分配顺序存储结构------------------------- # include "stdio.h" # include "malloc.h" # include "stdlib.h" # define M 5 //线性表存储空间的初始分配量 # define N 2 //线性表存储空间的分配增量 typedef struct { int *elem; //存储空间基址 int length; //当前长度 int listsize; //当前分配的存储容量(以sizeof(int)为单位) }SqList; int InitList(SqList *L) { // 构造一个空的线性表L L->elem=(int *)malloc(M*sizeof(int)); if(!L->elem) // 存储分配失败 exit(-2); L->length=0; // 空表长度为0 L->listsize=M; // 初始存储容量 return 1; } int IntPut(SqList *L) { //输入数据 int i,e; printf ("请输入你要输入数据的个数:\n"); scanf ("%d",&e); if (1>e||5e||5elem[i]); L->length=L->length+1; } return 1; }

代码审查参考文件

代码审查参考文档 代码审查(code review)是保证软件质量的一个重要环节,通过审查代码能够发觉代码中可能存在的问题并给予纠正,这些问题可能包括设计上的、实现上的或者编程风格等多方面。本文档通过列举代码编写过程中的一些常见的细节问题,为代码审查环节提供参考。 Java代码 一、对象和变量 1.存在未被使用的变量 Eclipse会自动用下划线标出 2.对象的重复创建 这是系统中普遍存在的问题,比如: public class PrtGrpEndorsementBL {

private GlobalInput mGlobalInput = new GlobalInput(); private boolean getInputData(VData cInputData) { mGlobalInput = (GlobalInput) cInputData.getObjectByObjectName( "GlobalInput", 0); return true; } } 那个地点mGlobalInput对象属于重复创建,因为在getInputData方法里会对它进行赋值,mGlobalInput使用的应该是从jsp页面传入的对象,因此改为private GlobalInput mGlobalInput = null; 又如: String msg = ""; if (..) { msg = "A"; }

else { msg = "B"; } 那个地点msg同样属于重复创建,改为String msg = null; 3.变量的作用域 Java的局部变量能够定义在函数的任何位置,有部分由c转学java的程序员适应将变量都定义在函数的顶部,因为在c 里只能那样定义。但实际上变量的作用域越短程序的内聚性就越高,耦合性也更低,程序更容易理解,因此在java里应该在使用前才定义变量。 4.局部变量的危害 定义过多的不必要的局部变量是造成系统难以维护的缘故之一,因为每增加一个局部变量我们就要先化时刻去理解那个局部变量的意思,因此我们要减少局部变量的使用。用函数的返回值来替代局部变量是一种有效的方法,这就需要我们用重构的方式从大的函数中提出小的函数,用小函数的返回值来替代原有的局部变量。把大函数分解本身也能够降低程序的耦合度。

实验一 数据结构顺序表的插入和删

实验一顺序表的操作 1.实验题目:顺序表的操作 2.实验目的和要求: 1)了解顺序表的基本概念、顺序表结构的定义及在顺序表上的基本操作(插入、删除、查找以及线性表合并)。 2)通过在Turbo C(WinTc,或visual stdio6)实现以上操作的C语言代码。 3)提前了解实验相关的知识(尤其是C语言)。 3.实验内容:(二选一) 1)顺序表的插入算法,删除算法,顺序表的合并算法 2)与线性表应用相关的实例(自己选择详尽实例) 4.部分参考实验代码: ⑴顺序表结构的定义: #include #define MAXLEN 255 typedef int ElemType; typedef struct { ElemType elem[MAXLEN]; int length; }sqList; ⑵顺序表前插(在第i号元素前插入一个新的元素) int ListInsert(sqList *la,int i,int x)

{ int j; if(i<0||i>la-> length +1) {printf(“\n the value of i is wrong!”); return 0; } if(la-> length +1>=MAXLEN) { printf(“\n overflow!”); return 0; } . for(j=la-> length;j>=i;j--) la->list[j+1]=la->list[j]; la->list[i]=x; la-> length++; return 1; } ⑶顺序表删除 int ListDelete(sqList *la,int i) { if(i<0||i>la-> length) { printf(“\n the position is wrong!\n”); return 0; }

参考文献代码要求规范

根据GB3469-83《文献类型与文献载体代码》规定,以单字母标识:M——专著(含古籍中的史、志论著) C——论文集 N——报纸文章 J——期刊文章 D——学位论文 R——研究报告 S——标准 P——专利 A——专著、论文集中的析出文献 Z——其他未说明的文献类型

电子文献类型以双字母作为标识: DB——数据库 CP——计算机程序 EB——电子公告 电子文献载体类型用双字母标识 ①磁带〔MT〕 ②磁盘〔DK〕 ③光盘〔CD〕 ④联机网络〔OL〕 非纸型载体电子文献,在参考文献标识中同时标明其载体类型:DB/OL——联机网上的数据库

DB/MT——磁带数据库 M/CD——光盘图书 CP/DK——磁盘软件 J/OL——网上期刊 EB/OL——网上电子公告 一、参考文献著录格式 1 、期刊作者.题名〔J〕.刊名,出版年,卷(期)∶起止页码 2、专著作者.书名〔M〕.版本(第一版不著录).出版地∶出版者,出版年∶起止页码 3、论文集作者.题名〔C〕.编者.论文集名,出版地∶出版者,出版年∶起止页码 4 、学位论文作者.题名〔D〕.保存地点.保存单位.年份

5 、专利文献题名〔P〕.国别.专利文献种类.专利号.出版日期 6、标准编号.标准名称〔S〕 7、报纸作者.题名〔N〕.报纸名.出版日期(版次) 8 、报告作者.题名〔R〕.保存地点.年份 9 、电子文献作者.题名〔电子文献及载体类型标识〕.文献出处,日期 二、文献类型及其标识 1、根据GB3469 规定,各类常用文献标识如下: ①期刊〔J〕 ②专著〔M〕 ③论文集〔C〕 ④学位论文〔D〕

CSS属性代码大全

CSS属性代码大全 一、CSS文字属性: color : #999999; /*文字颜色*/ font-family : 宋体,sans-serif; /*文字字体*/ font-size : 9pt; /*文字大小*/ font-style:itelic; /*文字斜体*/ font-variant:small-caps; /*小字体*/ letter-spacing : 1pt; /*字间距离*/ line-height : 200%; /*设置行高*/ font-weight:bold; /*文字粗体*/ vertical-align:sub; /*下标字*/ vertical-align:super; /*上标字*/ text-decoration:line-through; /*加删除线*/ text-decoration: overline; /*加顶线*/ text-decoration:underline; /*加下划线*/ text-decoration:none; /*删除链接下划线*/ text-transform : capitalize; /*首字大写*/ text-transform : uppercase; /*英文大写*/ text-transform : lowercase; /*英文小写*/ text-align:right; /*文字右对齐*/ text-align:left; /*文字左对齐*/ text-align:center; /*文字居中对齐*/ text-align:justify; /*文字分散对齐*/ vertical-align属性 vertical-align:top; /*垂直向上对齐*/ vertical-align:bottom; /*垂直向下对齐*/ vertical-align:middle; /*垂直居中对齐*/ vertical-align:text-top; /*文字垂直向上对齐*/ vertical-align:text-bottom; /*文字垂直向下对齐*/ 二、CSS边框空白: padding-top:10px; /*上边框留空白*/ padding-right:10px; /*右边框留空白*/ padding-bottom:10px; /*下边框留空白*/ padding-left:10px; /*左边框留空白 三、CSS符号属性: list-style-type:none; /*不编号*/ list-style-type:decimal; /*阿拉伯数字*/ list-style-type:lower-roman; /*小写罗马数字*/ list-style-type:upper-roman; /*大写罗马数字*/ list-style-type:lower-alpha; /*小写英文字母*/ list-style-type:upper-alpha; /*大写英文字母*/ list-style-type:disc; /*实心圆形符号*/

css样式大全(精华版)

字体属性:(font) 大小{font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD 样式{font-style: oblique;}(偏斜体) italic;(斜体) normal;(正常) 行高{line-height: normal;}(正常) 单位:PX、PD、EM 粗细{font-weight: bold;}(粗体) lighter;(细体) normal;(正常) 变体{font-variant: small-caps;}(小型大写字母) normal;(正常) 大小写{text-transform: capitalize;}(首字母大写) uppercase;(大写) lowercase;(小写) none;(无) 修饰{text-decoration: underline;}(下划线) overline;(上划线) line-through;(删除线) blink;(闪烁) 常用字体:(font-family) "Courier New", Courier, monospace, "Times New Roman", Times, serif, Arial, Helvetica, sans-serif, Verdana 背景属性:(background) 色彩{background-color: #FFFFFF;} 图片{background-image: url();} 重复{background-repeat: no-repeat;} 滚动{background-attachment: fixed;}(固定) scroll;(滚动) 位置{background-position: left;}(水平) top(垂直); 简写方法{background:#000 url(..) repeat fixed left top;} /*简写·这个在阅读代码中经常出现,要认真的研究*/ 区块属性:(Block) /*这个属性第一次认识,要多多研究*/ 字间距{letter-spacing: normal;} 数值/*这个属性似乎有用,多实践下*/ 对齐{text-align: justify;}(两端对齐) left;(左对齐) right;(右对齐) center;(居中) 缩进{text-indent: 数值px;} 垂直对齐{vertical-align: baseline;}(基线) sub;(下标) super;(下标) top; text-top; middle; bottom; text-bottom; 词间距word-spacing: normal; 数值 空格white-space: pre;(保留) nowrap;(不换行)

HTML代码大全

<><> 创建一个文档 <><> 设置文档标题和其它在网页中不显示地信息 <><> 设置文档地标题 <><> 最大地标题 <><> 预先格式化文本 <><> 下划线 <><> 黑体字 <><> 斜体字 <><> 打字机风格地字体 <><> 引用,通常是斜体 <><> 强调文本(通常是斜体加黑体) <><> 加重文本(通常是斜体加黑体) < "" ""><> 设置字体大小从到,颜色使用名字或地十六进制值 <><> 基准字体标记 <><> 字体加大 <><> 字体缩小 <><> 加删除线 <><> 程式码 <><> 键盘字 <><> 范例 <><> 变量 <><> 向右缩排 <><> 述语定义 <><> 地址标记 <><> 上标字 <><> 下标字 <>...<>固定寬度字体(在文件中空白、換行、定位功能有效) <>...<>固定寬度字體(不執行標記符號) <>...<> 固定寬度小字體 < >...<>字體顏色 < >...<>最小字體 < " ">...<>無限增大 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆《〈格式标志〉》◆◆◆◆◆◆◆◆◆◆◆◆<><> 创建一个段落 < ""> 将段落按左、中、右对齐 <>换行插入一个回车换行符 <><> 从两边缩进文本 <><> 定义列表 <> 放在每个定义术语词前 <> 放在每个定义之前 <><> 创建一个标有数字地列表 <><> 创建一个标有圆点地列表 <> 放在每个列表项之前,若在<><>之间则每个列表项加上一个数字, 若在<><>之间则每个列表项加上一个圆点 < ""><> 用来排版大块段落,也用于格式化表 <> 选项清单

<> 目录清单 <><> 强行不换行 < "" "" "">水平線(設定寬度) <><> 水平居中◆◆◆◆◆◆◆◆◆《〈链接标志表格标志〉》◆◆◆◆◆◆◆◆◆◆◆◆◆◆< ""><> 创建超文本链接 < ""> <> 创建自动发送电子邮件地链接 < ""><> 创建位于文档内部地书签 < ""><> 创建指向位于文档内部书签地链接 <> 文档中不能被该站点辨识地其它所有链接源地 <> 定义一个链接和源之间地相互关系 ◆◆◆◆◆◆◆◆链接标记注解:◆◆◆◆◆◆◆◆◆◆◆◆ ◆"..."决定链接源在什么地方显示(用户自定义地名字, ◆"..."发送链接地类型 ◆"..."保存链接地类型 ◆"..."指定该元素地热键 ◆"..."允许我们使用已定义地形状定义客户端地图形镜像(,,, ◆"..."使用像素或者长度百分比来定义形状地尺寸 ◆"..."使用定义过地元素设置在各个元素之间地焦点获取顺序(使用键使元素获得焦点) ◆◆◆◆◆◆◆◆表格标记注解:◆◆◆◆◆◆◆◆◆◆◆◆ <><> 创建一个表格 <><> 表格中地每一行 <><> 表格中一行中地每一个格子 <><> 设置表格头:通常是黑体居中文字 < ""> 设置表格格子之间空间地大小 < ""> 设置边框地宽度 < ""> 设置表格格子边框与其内部内容之间空间地大小 < ""> 设置表格地宽度.用绝对像素值或总宽度地百分比 < ""> 设置表格格子地水平对齐方式() < ""> 设置表格格子地水平对齐方式() < ""> 设置表格格子地垂直对齐方式() < ""> 设置一个表格格子跨占地列数(缺省值为) < ""> 设置一个表格格子跨占地行数(缺省值为) < > 禁止表格格子内地内容自动断行 <><> 表格地标题 <><> 定义多个列为一组列 <><> 创建一个表格 <><> 定义表格地页眉 <> 定义一个列组中地列,以便对它们能够同时设置有关属性 <><> 定义一个表格地实体 <><> 定义一个表格地页脚 ◆◆◆◆◆◆◆◆◆◆◆◆《表单标志》◆◆◆◆◆◆◆◆◆◆◆ <><> 创建表单 "..."接收数据地服务器地 "..."地方法(, ).其中是被反对使用地 "..."指定(媒体类型)

数据结构实验一顺序表

数据结构实验一 1、实验目的 ?掌握线性表的逻辑特征 ?掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算 2、实验内容: 建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空; 1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作: ?创建一个新的顺序表,实现动态空间分配的初始化; ?根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表; ?根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除); ?利用最少的空间实现顺序表元素的逆转; ?实现顺序表的各个元素的输出; ?彻底销毁顺序线性表,回收所分配的空间; ?对顺序线性表的所有元素删除,置为空表; ?返回其数据元素个数; ?按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回; ?按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回; ?判断顺序表中是否有元素存在,对判断结果进行返回; .编写主程序,实现对各不同的算法调用。 2.实现要求: ?“初始化算法”的操作结果:构造一个空的顺序线性表。对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间; ?“位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ; 操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1; ?“位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ; 操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ; ?“逆转算法”的初始条件:顺序线性表L 已存在; 操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换; ?“输出算法”的初始条件:顺序线性表L 已存在; 操作结果:依次对L 的每个数据元素进行输出; ?“销毁算法”初始条件:顺序线性表L 已存在;

参考文献字母代码

参考文献字母代码 Prepared on 22 November 2020

参考文献字母代码 根据GB3469-83《文献类型与文献载体代码》规定,以单字母标识: M——专着(含古籍中的史、志论着) C——论文集 N——报纸文章 J——期刊文章 D——学位论文 R——研究报告 S——标准 P——专利 A——专着、论文集中的析出文献 Z——其他未说明的文献类型 电子文献类型以双字母作为标识: DB——数据库 CP——计算机程序 EB——电子公告 非纸张型载体电子文献,在参考文献标识中同时标明其载体类型: DB/OL——联机网上的数据库 DB/MT——磁带数据库 M/CD——光盘图书 CP/DK——磁盘软件 J/OL——网上期刊 EB/OL——网上电子公告 一、参考文献着录格式 1、期刊作者.题名〔J〕.刊名,出版年,卷(期)∶起止页码 2、专着作者.书名〔M〕.版本(第一版不着录).出版地∶出版者,出版年∶起止页码 3、论文集作者.题名〔C〕.编者.论文集名,出版地∶出版者,出版年∶起止页码 4、学位论文作者.题名〔D〕.保存地点.保存单位.年份 5、专利文献题名〔P〕.国别.专利文献种类.专利号.出版日期 6、标准编号.标准名称〔S〕 7、报纸作者.题名〔N〕.报纸名.出版日期(版次) 8、报告作者.题名〔R〕.保存地点.年份 9、电子文献作者.题名〔电子文献及载体类型标识〕.文献出处,日期 二、文献类型及其标识 1、根据GB3469规定,各类常用文献标识如下: ①期刊〔J〕 ②专着〔M〕 ③论文集〔C〕 ④学位论文〔D〕 ⑤专利〔P〕 ⑥标准〔S〕

⑦报纸〔N〕 ⑧技术报告〔R〕 2、电子文献载体类型用双字母标识,具体如下: ①磁带〔MT〕 ②磁盘〔DK〕 ③光盘〔CD〕 ④联机网络〔OL〕 3、电子文献载体类型的参考文献类型标识方法为:〔文献类型标识/载体类型标识〕。例如: ①联机网上数据库〔DB/OL〕 ②磁带数据库〔DB/MT〕 ③光盘图书〔M/CD〕 ④磁盘软件〔CP/DK〕 ⑤网上期刊〔J/OL〕 ⑥网上电子公告〔EB/OL〕

CSS属性大全完整版

CSS属性大全完整版 字体属性:(font) 大小 font-size: x-large; (特大) xx-small; (极小) 一般中文用不到,只要用数值就可以,单位:PX、PD 样式 font-style: oblique; (偏斜体) italic; (斜体) normal; (正常) 行高 line-height: normal; (正常) 单位:PX、PD、EM 粗细 font-weight: bold; (粗体) lighter; (细体) normal; (正常) 变体 font-variant: small-caps; (小型大写字母) normal; (正常) 大小写 text-transform: capitalize; (首字母大写) uppercase; (大写) lowercase; (小写) none; (无) 修饰 text-decoration: underline; (下划线) overline; (上划线) line-through; (删除线) blink; (闪烁) 常用字体

font-family: "Courier New", Courier, monospace, "Times New Roman", Times, serif, Arial, Helvetica, sans-serif, Verdana 背景属性:(background) 色彩 background-color: #FFFFFF; 图片 background-image: url(); 重复 background-repeat: no-repeat; 滚动 background-attachment: fixed; (固定) scroll; (滚动) 位置 background-position: Left (水平) top (垂直); 简写方法background:#000 url(..) repeat fixed left top; 区块属性:(Block) 字间距 letter-spacing: normal; 数值 对齐 text-align: justify; (两端对齐) left; (左对齐) right; (右对齐) center; (居中) 缩进

顺序表的实现,包含插入 删除 查找等操作,完整源代码,有注释

实验一顺序表的实现 实验目的:熟练掌握顺序表的基本操作(插入、删除、查找等) 实验内容:顺序表中的基本操作的实现(初始化、插入、删除、求表长、按值查找、按位置查找) 实验要求:以顺序表的动态分配存储结构来实现;所有基本操作均应该以函数的形式表示;要有运行结果并考虑到顺序表中所有情况。 一、实验算法描述: 1、顺序表的声明和创建 typedef struct { int* data;//int*型元素 int length;//顺序表的实际长度 int listsize;//顺序表的最大长度 }sqlist; void creatsqlist(sqlist &list) { list.data=(int*)malloc(sizeof(int)*maxsize);//开辟一个名为l的顺序表 if(!list.data)//判断顺序表是否存在 exit(1); list.length=0; list.listsize=maxsize; } 2、初始化函数initsqlist(list) void initsqlist(sqlist &list)//初始化操作 { int* p; int n; cout<<"请输入顺序表元素数(1-50):"<>n; cout<<"您申请的顺序表的长度是---"<>*p; p++; list.length++;

[实用参考]代码说明文档.doc

简介FHQ313596790 Springmvc+mybatis组合框架 Oracle和mysql俩版本 1各包说明 1.1Src 1.controller:业务处理包(日常代码维护主要包) 2.dao:增删改查的接口(无需操作,不用管它) 3.entity:实体类包(存放实体类) 4. filter:登录顾虑验证器(可以在此添加一段代码,让tomcat启动后立即自动执 行 需要配置web.Gml 5.interceptor:session有效期验证 请求的连接中GGG.do不包含login,logout,code,app 等字符的,都会被判断session存在与否,否:跳转到登录,是:跳转到相应地址 6.Listener:在web容器启动时由WebAppConteGtListener初始化 7.Plugin:分页插件(已经处理好,无需更改)

8.Listene:MyEGceptionResolver异常处理 9.Util所有工具类(发邮件,发短信,日期格式化等) 1.2resources 1.mybatis:对应的配置文件 2.spring:spring的配置文件ApplicationConteGt.Gml 3.log4j日志处理配置,可设置生成日志文件到硬盘的某个目录下 4.dbconfigerties:数据库链接池配置 5.shior配置,在spring/ApplicationConteGt.Gml 1.2WebRoot admin:存放配置文件,代码生成器生成的代码(相对tomcat的目录) plugins:插件存放目录 static:jscssimg等存放目录 jsp:在WEB-INF目录下 增删改查流程 增加:(form表单提交数到后台在存入数据库) form表单action=”user/saveU.do” 1.比如新增用户,”user”对应的是

参考文献类型及代码

参考文献类型及代码: 专著[M],论文集[C],报纸文章[N],期刊文章[J],学位论文[D],报告[R],标准[S],专利[P],论文集中的析出文献[A]电子文献类型:数据库[DB],计算机[CP],电子公告[EB]电子文献的载体类型:互联网[OL],光盘[CD],磁带[MT],磁盘[DK]A:专著、论文集、学位论文、报告 [序号]主要责任者.文献题名[文献类型标识].出版地:出版者,出版年:起止页码(可选)例:[1]刘国钧,陈绍业.图书馆目录[M].北京:高等教育出版社,. B:期刊文章 [序号]主要责任者.文献题名[J].刊名,年,卷(期):起止页码 例:[1]何龄修.读南明史[J].中国史研究,1998,(3):167-173. C:论文集中的析出文献 [序号]析出文献主要责任者.析出文献题名[A].原文献主要责任者(可选).原文献题名[C].出版地:出版者,出版年.起止页码 例:[7]钟文发.非线性规划在可燃毒物配置中的应用[A].赵炜.运筹学的理论与应用——中国运筹学会第五届大会论文集[C].西安:西安电子科技大学出版社,. D:报纸文章 [序号]主要责任者.文献题名[N].报纸名,出版日期(版次) 例:[8]谢希德.创造学习的新思路[N].人民日报,1998-12-25(10). E:电子文献 [文献类型/载体类型标识]:[J/OL]网上期刊、[EB/OL]网上电子公告、[M/CD]光盘图书、[DB/OL]网上数据库、[DB/MT]磁带数据库 [序号]主要责任者.电子文献题名[电子文献及载体类型标识].电子文献的出版或获得地址,发表更新日期/引用日期 例:[12]王明亮.关于中国学术期刊标准化数据库系统工程的进展[EB/OL].,1998-08-16/1998-10-01.[8]万锦.中国大学学报文摘(1983-1993).英文版[DB/CD].北京:中国大百科全书出版社,1996

JavaScript 经典代码大全

代码一 1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键

no
可用于Table 2. 取消选取、防止复制 3. onpaste="return false" 不准粘贴 4. oncopy="return false;" oncut="return false;" 防止复制 5. IE地址栏前换成自己的图标 6. 可以在收藏夹中显示出你的图标 7. 关闭输入法 8. 永远都会带着框架 9. 防止被人frame 10. 网页将不能被另存为 11. 12.删除时确认 删除 13. 取得控件的绝对位置 //javascript //VBScript =====javascript中弹出提示框跳转到其他页面===== ================================= 按钮式: 链接式: 返回上一步 ">返回上一步 直接跳转式: 开新窗口:

HTML中CSS样式标签大全及用法

CSS 网页样式大全如下: 字体属性:(font) 大小font-size: x-large;(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD 样式font-style: oblique;(偏斜体) italic;(斜体) normal;(正常) 行高line-height: normal;(正常) 单位:PX、PD、EM 粗细font-weight: bold;(粗体) lighter;(细体) normal;(正常) 变体font-variant: small-caps;(小型大写字母) normal;(正常) 大小写text-transform: capitalize;(首字母大写) uppercase;(大写) lowercase;(小写) none;(无) 修饰text-decoration: underline;(下划线) overline;(上划线) line-through;(删除线) blink;(闪烁) 常用字体:(font-family) "Courier New", Courier, monospace, "Times New Roman", Times, serif, Arial, Helvetica, sans-serif, Verdana 背景属性:(background) 色彩background-color: #FFFFFF; 图片background-image: url(); 重复background-repeat: no-repeat; 滚动background-attachment: fixed;(固定) scroll;(滚动) 位置background-position: left(水平) top(垂直); 简写方法background:#000 url(..) repeat fixed left top; 区块属性:(Block) 字间距letter-spacing: normal; 数值 对齐text-align: justify;(两端对齐) left;(左对齐) right;(右对齐) center;(居中) 缩进text-indent: 数值px; 垂直对齐vertical-align: baseline;(基线) sub;(下标) super;(下标) top; text-top; middle; bottom; text-bottom; 词间距word-spacing: normal; 数值 空格white-space: pre;(保留) nowrap;(不换行) 显示display:block;(块) inline;(内嵌) list-item;(列表项) run-in;(追加部分) compact;(紧凑) marker;(标记) table; inline-table; table-raw-group; table-header-group; table-footer-group; table-raw; table-column-group; table-column; table-cell; table-caption;(表格标题) 方框属性:(Box) width:; height:; float:; clear:both; margin:; padding:; 顺序:上右下左 边框属性:(Border) border-style: dotted;(点线) dashed;(虚线) solid; double;(双线) groove;(槽线) ridge;(脊状) inset;(凹陷) outset; border-width:; 边框宽度 border-color:#; 简写方法border:width style color; 列表属性:(List-style)

相关文档
最新文档