istream&?operator>>?(istream&?is,?String?&other)
{
//預分配100個空間
char?*str?=?(char?*)malloc(sizeof(char)*100);
char?*buf?=?str;
int?i?=?1;
//預處理:跳過流裏面的所有空格和回車
while?((*buf?=?getchar())?==?'?'?||?(*buf?==?'\n'));
for?(?;?;?++i)
{
if?(*buf?==?'\n')?//回車跳出
{
*buf?=?'\0';
break;
}
else?if?(*buf?==?'?')?//空格跳出
{
*buf?=?'\0';
break;
}
else?if?(i?%?100?==?0)?//空間不足
{
i?+=?100;?//追加100個空間
str?=?(char?*)realloc(str,i);
}
else//每次getchar()壹個值
{
buf?=?(str+i);//為了避免realloc返回首地址改變,不使用++buf,而是用str加上偏移.
//每次讀取壹個字符
*buf?=?getchar();
}
}
//至此:輸入完成
//我原本已經重載了=號
other?=?str;?//拷貝:將臨時開辟空間裏頭的數據,拷貝如字符串中
free(str);?//釋放臨時開辟的空間
str?=?NULL;
buf?=?NULL;
return?is;
}
這是我看了VS2010裏面string,動態輸入實現原理仿照寫的壹個。
它主要是先預開辟壹段空間,然後壹直是按照每次追加壹個字符的原理輸入,妳可以看壹下VS2010裏面的源碼,如下圖: