#include <stdio.h>
#define slice(bare_string,start_index) #bare_string+start_index
#define arcane_slice(bare_string,start_index) "ARCANE" #bare_string+start_index
int main(){
printf("slice(FIRSTA,0)==> `%s`\n",slice(FIRSTA,0));
printf("slice(SECOND,2)==> `%s`\n",slice(SECOND,2));
printf("slice(THIRDA,5)==> `%s`\n",slice(THIRDA,5));
printf("slice(FOURTH,6)==> `%s`\n",slice(FOURTH,6));
printf("slice(FIFTHA,7)==> `%s`\n",slice(FIFTHA,7));
printf("arcane_slice(FIRSTA,0)==> `%s`\n",arcane_slice(FIRST,0));
printf("arcane_slice(SECOND,2)==> `%s`\n",arcane_slice(SECOND,2));
printf("arcane_slice(THIRDA,5)==> `%s`\n",arcane_slice(THIRDA,5));
printf("arcane_slice(FOURTH,6)==> `%s`\n",arcane_slice(FOURTH,6));
printf("arcane_slice(FIFTHA,7)==> `%s`\n",arcane_slice(FIFTHA,7));
return 0;
}
出力:
slice(FIRSTA,0)==> `FIRSTA`
slice(SECOND,2)==> `COND`
slice(THIRDA,5)==> `A`
slice(FOURTH,6)==> ``
slice(FIFTHA,7)==> `slice(FIFTHA,7)==> `%s`
`
arcane_slice(FIRSTA,0)==> `ARCANEFIRST`
arcane_slice(SECOND,2)==> `CANESECOND`
arcane_slice(THIRDA,5)==> `ETHIRDA`
arcane_slice(FOURTH,6)==> `FOURTH`
arcane_slice(FIFTHA,7)==> `IFTHA`
ヘルプが必要な上記の C コードがあります。
渡されたインデックスから文字列の末尾まで「スライス」するはず
の関数のようなマクロから、奇妙な動作が発生しています。本当の意味でスライスするのではなく
、特定のポイントからその
アドレスから印刷を開始するポインターを渡します。文字列が最初に連結されてから
「スライス」されることがわかりました。また、いつ
が 6 に等しいかがヌルバイトから印刷を開始することもわかりました
。これが、「空の」文字列を取得する理由です。奇妙な部分は、が 7の場合です。両方で渡されたベア文字列と連結された (補間文字列)
への最初の引数を出力します。slice
printf
arcane_slice
start_index
printf
start_index
printf
arcane_slice
そしてslice
(出力の 5 行目と 10 行目に示されているように)
なぜそうなのか?
私の推測ではstart_index
、文字列の長さを超えると
、ポインターはプログラムのアドレス空間内のデータ セグメントの先頭を指します。しかし
、「なぜ印刷を開始しなかったのか」でそれを反論することができますFIRSTA
。