乙個空格也不容易看出來。當你的程式出現上面的問題時,自己對照檢查一下就可以了。
實現原理
#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...