ID非公開

2022/1/25 1:33

22回答

プログラミングのC言語の文字列の問題です。解答例を知りたいです。どなたかお願いします。

補足

囲い切れない場合は途中までで大丈夫です。 例 abcdefghijklmnopqrstuv whhhhhhhhhhhhhhhhhhhhx yz

C言語関連107閲覧

ベストアンサー

0

その他の回答(1件)

0

#define _CRT_SECURE_NO_WARNINGS // Visual Studio only #include <stdio.h> int main(void) {     char S[20+1];          // 入力文字列     char buf[3][1+20+1+1]; // 囲まれる文字列     printf("> ");     scanf("%s", S);     const char* sp = S;   // 転送元ポインタ     char* dpu = buf[0];   // 転送先上段ポインタ     char* dpm = buf[1]+1; // 転送先中段ポインタ     char* dpL = buf[2];   // 転送先下段ポインタ     char ch = 'a';        // 囲む文字 // 上段と中断のコピー     for (; *sp;) {         *dpu++ = ch++;         *dpm++ = *sp++;     }     *dpu++ = ch++;    // 上段は2文字分多いので。     *dpu++ = ch++;     *dpu = '\0';      // 上段のヌル文字を代入     buf[1][0] = ch++; // 中段の左端の文字を代入     *dpm++ = ch++;    // 中段の右端の文字を代入     *dpm = '\0';      // 中段のヌル文字を代入 /* 転送先の終了先を指すポインタを作ります。 dpmは中段のヌル文字を指すアドレスを持っています(ポインタ)。 buf[1]中段の最初の文字を指すアドレスを持っています。 そのアドレスの差(dpm - buf[1])は中段の長さ(サイズ)になります。 --- 例: 012345 hello\0 先頭文字'h'のアドレスはstr+0。 strはhelloという文字列を格納している適当な配列のアドレスです。 '\0'のアドレスはstr+5。 ヌル文字を指すアドレス - 先頭文字を指すアドレス  = (str+5) - (str+0) = 5 これはhelloという文字列の長さに等しくなります。 --- buf[2]は転送先の最初の文字のアドレスです。 これに中段の長さ(サイズ)を足すことで転送先の末尾の文字の直後の ヌル文字のアドレス(予想される)になります。 dpeは転送先のヌル文字のアドレスを指します(書き込む文字が'z'を超えなければ)。 --- 終了ポインタ(end pointer)は難しいかもしれませんが C言語/C++では良く使われるのでぜひ覚えてください。 */     char* dpe = buf[2] + (dpm - buf[1]); // 下段の代入 // 終了ポインタを超えるか書き込む文字が'z'を超えるかまでループします。     for (; dpL < dpe && ch <= 'z'; ) {         *dpL++ = ch++;     }     *dpL = '\0'; // 下段のヌル文字を代入     printf("%s\n", buf[0]); // 上段の表示     printf("%s\n", buf[1]); // 中段の表示     printf("%s\n", buf[2]); // 下段の表示 }