1
#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

4

3 に答える 3

0

あなたはあなた自身の質問に答えました。 "FIFTHA"+7これは、C では未定義の動作です。

C でこのような「スライス」をより Python に似た動作にする簡単な方法はありません。ゼロ バイトでいっぱいのサフィックスを文字列に追加することで、特定の上限までのインデックスで機能させることができます。

#define slice(bare_string,start_index) ((#bare_string "\0\0\0\0\0\0\0")+(start_index))

また、マクロを使用する場合は、括弧を過度に使用することをお勧めします (バグも回避します)。

#define slice(bare_string,start_index) ((#bare_string)+(start_index))
#define arcane_slice(bare_string,start_index) (("ARCANE" #bare_string)+(start_index))
于 2013-08-31T11:08:34.287 に答える
0
 slice(bare_string,start_index) #bare_string+start_index  

あなたはaを渡し、渡した文字列の開始アドレスstringbare_string格納し、変更されたポインタ位置を返しますbare_string+start_index

char str[6]="Hello";

char *ptr =str;

printf("%s\n",str);//prints hello

printf("%s\n",str+1);//prints ello
printf("%s\n",str+2);//prints llo
printf("%s\n",str+3);//prints lo
printf("%s\n",str+4);//prints o
printf("%s %c=%d  \n",str+5,*(str+5),*(str+5));//prints Null
printf("%s %c=%d  \n",str+6,*(str+6),*(str+6));//prints Null or may be Undefined behavior
printf("%s %c=%d  \n",str+7,*(str+7),*(str+7));//prints Null or may be Undefined behaviour

あなたの場合、同じシナリオが発生しています。

テストコード:

#include<stdio.h>

main()
{
char str[6]="Hello";

char *ptr =str;

printf("%s\n",str);//prints hello

printf("%s\n",str+1);//prints ello
printf("%s\n",str+2);//prints llo
printf("%s\n",str+3);//prints lo
printf("%s\n",str+4);//prints o
printf("%s %c=%d  \n",str+5,*(str+5),*(str+5));//prints Null
printf("%s %c=%d  \n",str+6,*(str+6),*(str+6));//prints Null or may be Undefined behavior
printf("%s %c=%d  \n",str+7,*(str+7),*(str+7));//prints Null or may be Undefined behaviour

}
于 2013-08-31T11:06:30.343 に答える