C 中的累類!

2021-06-20 17:49:56 字數 4367 閱讀 6064

乙個空格也不容易看出來。當你的程式出現上面的問題時,自己對照檢查一下就可以了。

實現原理

#include   

#include   

#include    "loc_incl.h"

int scanf(const char *format, …)

在上述**中我們可以看到有乙個_doscan函式,而這一函式在標頭檔案loc_incl.h中定義,函式宣告如下:

int _doscan(file * stream, const char*format, va_list ap)

int _doscan(register file *stream, const char *format, va_list ap)

if (ic != eof) ungetc(ic,stream);

nrchars--;

}if (!*format) break;    /* end of format */

if (*format != '%')

format++;

if (*format == '%')

else break;

}flags = 0;

if (*format == '*')

if (isdigit (*format))

switch (*format)

kind = *format;

if ((kind != 'c') && (kind != '[') && (kind != 'n')) while (isspace(ic));

if (ic == eof) break;        /* outer while */

} else if (kind != 'n')

switch (kind)

break;

case 'p':        /* pointer */

set_pointer(flags);

/* fallthrough */

case 'b':        /* binary */

case 'd':        /* decimal */

case 'i':        /* general integer */

case 'o':        /* octal */

case 'u':        /* unsigned */

case 'x':        /* hexadecimal */

case 'x':        /* ditto */

if (!(flags & fl_widthspec) || width > numlen)

width = numlen;

if (!width) return done;

str = o_collect(ic, stream, kind, width, &base);

if (str < inp_buf

|| (str == inp_buf

&& (*str == '-'

|| *str == '+'))) return done;

/** although the length of the number is str-inp_buf+1

* we don't add the 1 since we counted it already

*/nrchars += str - inp_buf;

if (!(flags & fl_noassign))

break;

case 'c':

if (!(flags & fl_widthspec))

width = 1;

if (!(flags & fl_noassign))

str = va_arg(ap, char *);

if (!width) return done;

while (width && ic != eof)

}if (width)

break;

case 's':

if (!(flags & fl_widthspec))

width = 0xffff;

if (!(flags & fl_noassign))

str = va_arg(ap, char *);

if (!width) return done;

while (width && ic != eof && !isspace(ic))

}/* terminate the string */

if (!(flags & fl_noassign))

*str = '\0';

if (width)

break;

case '[':

if (!(flags & fl_widthspec))

width = 0xffff;

if (!width) return done;

if ( *++format == '^' ) else

reverse = 0;

for (str = xtable; str < &xtable[nr_chars]

; str++)

*str = 0;

if (*format == ']') xtable[*format++] = 1;

while (*format && *format != ']')

else xtable['-'] = 1;}}

if (!*format) return done;

if (!(xtable[ic] ^ reverse))

if (!(flags & fl_noassign))

str = va_arg(ap, char *);

do } while (width && ic != eof && (xtable[ic] ^ reverse));

if (width)

if (!(flags & fl_noassign))

break;

#ifndef    nofloat

case 'e':

case 'e':

case 'f':

case 'g':

case 'g':

if (!(flags & fl_widthspec) || width > numlen)

width = numlen;

if (!width) return done;

str = f_collect(ic, stream, width);

if (str < inp_buf

|| (str == inp_buf

&& (*str == '-'

|| *str == '+'))) return done;

/** although the length of the number is str-inp_buf+1

* we don't add the 1 since we counted it already

*/nrchars += str - inp_buf;

if (!(flags & fl_noassign))

break;

#endif

}        /* end switch */

conv++;

if (!(flags & fl_noassign) && kind != 'n') done++;

format++;

}return conv || (ic != eof) ? done : eof;

}在上面的源**中,值得注意的是第26行的getc巨集,定義**如下:

#define   getc(p)        (--(p)->_count>= 0 ? (int) (*(p)->_ptr++) : \

__fillbuf(p))

getc的呼叫形式:ch=getc(fp); 功能是從檔案指標指向的檔案讀入乙個字元,並把它作為函式值返回給int型變數ch.

第4行~第17行,定義一些後面需要用到的變數

第23行~第34行,跳過format格式串中的空格,並且跳過輸入流中的空格

第37行~第42行,輸入流stream與format格式串中的空白符(空白符可以是空格(space)、製表符(tab)和新行符(newline))保持一致

第44行~第52行,在format中的字元為'%'的前提下,stream中的字元也為'%',則繼續

第54行~第57行,format當前字元為'*',表示讀指定型別的資料但不儲存

第58行~第62行,指定說明最大域寬。在百分號(%)與格式碼之間的整數用於限制從對應域讀入的最大字元數於寬度

第64行~第282行,switch語句,用於格式修飾符,這些修飾符包括: h、l、l、c、p、b、d、i、o、u……,還有基於掃瞄集的'['修飾符

陣列中字陣列的最大累乘積

題目 給定乙個double型別的陣列arr,其中元素可正 可負 可0,返回子陣列累成的最大乘積。例如,arr 2.5,4,0,3,0.5,8,1 子陣列 3,0.5,8 累乘可以獲得最大的乘積12,故返回12 要求 時間複雜度o n 額外空間複雜度o 1 public static void mai...

numpy中的裁剪 壓縮和累乘

主要介紹三個函式 以下numpy都用np代替 np.ndarray.clip min,max 大於max的值會被重設成max,小於min的值會被重設成min 不指定min max預設為min 可以只選乙個 也可以都選 in 47 a np.arange 1,10 in 49 a.clip max 4...

c 類和C 中定義類的定義

c 類和c 中定義類的定義 相同處 1.1.都需要使用 class標識 1.2.都包含有成員 函式,屬性 1.3.都有private public protect 標識的成員 2.不同之處 2.2.c 申明類及成員時格式 class member 一般在class的末尾處需要乙個英文分割符號 pub...