3

私はもともと Java プログラマーで、現在は C、特に C のポインターに苦労しています。

私の考えは、ユーザーからコマンドラインで文字列を受け取り、文字ポインターにすることです。次に、その個々の要素にアクセスしたいと思います。アイデアは、要素の順序を逆にする関数を後で考案することです。(テキストでアナグラムを扱いたい。)

私のコードは

#include <stdio.h>

char *string; 


int main(void)
{
printf("Enter a string: ");
scanf("%s\n",string);
putchar(*string);

int i;
for (i=0; i<3;i++)
{
  string--;
}
putchar(*string);

}

(申し訳ありませんが、コード マーキングは機能しません)。私がやろうとしているのは、個々の要素にアクセスする最初のショットを持つことです。文字列が "Santillana" で、ポインターが最初 (scanf() の後) に設定されている場合、コンテンツ *string は S である必要があります。 scanf() の後、いくつかのステップ (string-- 繰り返し) をバックアップすると、*string を使用した文字のように何かが生成されるはずです。ただし、これらの putchar() は両方ともセグメンテーション違反を引き起こします。

私は何か根本的に間違ったことをしており、何か根本的なことが私から逃れています。私の欠点についてのアドバイス、特にこれらの特定の問題が明らかにされている本/リソースのヒントに永遠に感謝します. 分厚い C の本 2 冊とリファレンス マニュアルは、これまでのところ役に立たないことがわかっています。

4

2 に答える 2

7

文字列にスペースを割り当てていません。次のようなものが必要です。

char string[1024];

また、変数をデクリメントしないでくださいstring。配列の場合、それはできません。

あなたは単に行うことができます:

putchar(string[i]);

または、(提案された配列への) ポインターを使用できます。

char *str = string;

for (i = 0; i < 3; i++)
    str++;

putchar(*str);

ただし、そのループを次のように短縮できます。

str += 3;

または単に次のように記述します。

putchar(*(str+3));

等。


成功したことを確認する必要がscanf()あります。バッファ (スタック) オーバーフローを避けるために、入力文字列のサイズを制限する必要があります。

if (scanf("%1023s", string) != 1)
    ...something went wrong — probably EOF without any data...

%s先頭の空白をスキップして、次の空白まで文字を読み取ることに注意してください(「単語」の単純な定義)。フォーマット文字列に改行を追加しても、ほとんど違いはありません。"%1023[^\n]\n"代わりに考えることができます。これは、最大 1023 個の非改行とそれに続く改行を検索します。

グローバル変数を避けることから始めるべきです。必要な場合もありますが、この例では必要ありません。

于 2012-09-09T02:08:05.327 に答える
0

ちなみに、scanf(3)を使用することは悪い習慣です。scanf(3)に関連する一般的な落とし穴を回避するfgets(3)または同様の関数を調べることをお勧めします。

于 2012-09-09T13:10:37.853 に答える