2017-02-03 4 views
-5

をライブラリ関数、配列、またはメモリ管理なしでCのchar *に追加できますか?ライブラリ関数、配列、またはメモリ管理なしでCのchar *にcharを追加する

配列を作成せずに行う必要があるため、[]で何も使用できません。私はmallocまたは何かの並べ替えを使用することはできません、私はライブラリ関数を使用することはできません。

本当の目標は文字列を回転させることです。

JavaのようにCの+演算子で文字列を連結する方法はありますか?

は、ここで私が持っているものです。

char* alphabet = "abcdefghijklmop" 
//I want to create a new string which is the rotated version of that string by 
// n amount so if n was 3 it would be "defghijklmnopabc" 

char* = string; 

for(i=0; i<lengthOfString; i++){ 
     int amountToShiftBy = (n+i); 
     if(amountToShiftBy>=lengthOfString) 
       amountToShiftBy-=lengthOfString; 
     string = string + *(alphabet+shift); //obviously doesn't work 
} 
+0

メモリを持たないポインターをポイントすることはできません。 –

+0

私はメモリを持っています。私はmalloc、realloc、calloc、mmapなどの機能を使用できませんでした。 – James

+0

@ChrisDodd - まあ... Cで間違いなくできる。 –

答えて

1

を要約すると、あなたの質問が不明確さ、あなたはおそらく何を意味するか愚かと時間の無駄が、それでも可能です。

タイトルには何ができるのですか?

なK & R2Eとして本から読んで、あなたは、むしろ彼らに出会うと演習を行うことによって、例えば(char* ...

確かにcharを追加していますが、適切にCを学ぶたらそれらをバイパスするよりも)、これはおそらくあなたが達成したいことではないことを学びます。

例として、char c;があり、&c + 42と書くと、cへのポインタに42が追加され、ポインタがcの先頭から42文字進みます。 cにはの1つしかないので、明らかにこれはエラーです文字です。ライブラリ関数、配列、または、NTメモリmanagem [E]」なし

...。

を確認してください。上記の例を参照してください。

を現実の世界では、これは次のようになります愚かなエクササイズ。ライブラリの機能を再利用するように教えられているのは、既存のコードを再利用すること、車輪を再テストすること、改造をテスト/デバッグすること、再調整すること、テスト/デバッグすることです。おそらく標準的なライブラリ開発者あなたが行うよりもプラットフォームごとに最適なコードを書く方法を知っています。

...配列を作成せずに行う必要があるため、[]で何も使用できません。

技術、[]添字オペレータアレイオペレータありません。

それはsizeof演算子、_Alignof演算子、または単項のオペランドである場合を除き:C標準の6.3.2.1p3が説明するように、それは、(ちょうどあなたがあなたのコードで使用される単項*オペレータのような)ポインタ演算子です&演算子、または配列を初期化するために使用される文字列リテラルである場合、型 ''配列型 ''を持つ式は、配列オブジェクトの最初の要素を指す型 ''ポインタ型 ''の式に変換されます左辺値ではありません。


Cでの+演算子で文字列をCONCATする方法はあり

...

連結のために使用することができたa variation of the xor swap, known as the add swapあります。しかし、私はこの記事の前半で説明したように、これがより効率的であれば、標準ライブラリの開発者はそれを使用していました。さらに、それは確かに簡潔慣用またはエレガント解決策ではないでしょう。それは誰かが汚れたトイレに投げ込んで栄養価の高いスープと呼ぶのと同等です。よりシンプルなアプローチを思いついた方が良いでしょう。

void append_char(char *str, char c) { 
    str += strlen(str); 
    *str++ = c; // This could be written using an add swap 
    *str = '\0'; // ... and so could this 
} 

<string.h>からstrlenを使用することはできませんか?シンプルなソリューション:標準ライブラリのソースコードを開き、strlenコードを見つけて、コピーしてプログラムに貼り付けてください。あなたのコンピュータをビンに投げてください!あなたの教授はあなたに時間を浪費するよう教えています。

もしあなたの教授が標準ライブラリをspecに書き直すように指示していたら、これは標準ライブラリの使い方を教えてくれるので便利な練習になります。

... javaのようにできますか?

Java機能を使用する場合は、Javaを使用します。 CはJavaではありません。物事は異なって行われます。

この全体の<string.h>事は私自身は、私はちょうど約すべての言語に長所と短所があるあなたを伝えることができます( JavaとCの両方を含む)しかし、多数の言語を学ぶことから、直感的に見えるかもしれません。 Javaはが多く、短所があります。あなたはCを持っていることが分かるでしょうが、Cもあります。farがあります。

FWIW、私はCファンボーイではありません。私はハスケルファンボーイです。 Haskellは、ガベージコレクション、静的型、および多数の多形を持つため、意味的にJavaに近いです。

char* alphabet = "abcdefghijklmop" 
//I want to create a new string which is the rotated version of that string by n amount so if n was 3 it would be "defghijklmnopabc" 

あなた MCVE(それは頭字語MCVEで C失敗)と配列を(それがタイトルにテストを失敗した)を使用してコンパイルされません。

にもかかわらず、この目標も可能です。変更しようとしている文字列と同じサイズの新しい配列を作成し、コピー元の末尾をコピー先の先頭に、コピー元の先頭をコピー先の末尾にコピーします。たとえば:あなたは、標準ライブラリからsprintfを再利用することが許可されていない場合は、標準ライブラリを

void rotate_string(char *destination, char const *source, size_t n) { 
    if (n > strlen(n) || n > INT_MAX) { n = 0; } 
    sprintf(destination, "%s%.*s", source + n, (int) n, source); 
} 

含まれていません。ただsprintfを改革してください。それは運動の一部ですよね?

標準ライブラリのINT_MAXを使用できない場合は、32767または42を使用してください。それは魔法の数であり、私たちは一般的にではなく、でマジックナンバーを使用するように教えられています...しかし、あなたの練習はあなたにそれを正確に教えることです。しかたがない。教育の質は重要です。私の教授が私の上でこれを試してみると、私は騒いでいます!

関連する問題