0

であるグローバル変数があり*charます。私のメイン関数ヘッダーはint main(int argc, char* argv[argc]){...}. この 2 行のコードはそのままにしておく必要があります。メイン関数の最初の引数は、*charを使用して char に変換するtype の数ですatoi(...);。私は基本的にASCII値を対応する文字に変更しています。今、私が持っているこのローカル変数の文字を、char ポインターであるグローバル変数に格納したいと思います。問題がメモリの割り当てに関連していることはわかっていますが、これについてどうすればよいかわかりません。

私のコード:

char* delim;
int main(int argc, char* argv[argc])
{
  char delimCharacter;
  if (isdigit(*(argv[3])) == 0) delim = argv[3]; //you can pass in a character or its ascii value
  else {   //if the argument is a number, then the ascii value is taken
    delimCharacter = atoi((argv[3]));
    printf("%s\t,%c,\n", argv[3], delimCharacter);
    //sprintf( delim, "%c", delimCharacter );  // a failed attempt to do this
    *delim = delimCharacter;
    //strncpy(delim, delimCharacter, 1);                // another failed attempt to do this
  }
  //printf("%s\n",delim);

これにより、セグ フォールトが発生します。

4

4 に答える 4

1

使用を開始する前に、(少なくとも) 3 つの引数があることを確認する必要があります。

if (argc < 4)
{
    printf("Need 3 args");
    exit(1);
}

次に、キャラクターを配置するためのメモリを割り当てる必要があります。

delim = malloc(2);
// TODO: Should check the result of malloc before using it.
*delim = delimCharacter;
delim[1] = 0; // Need to NULL terminate char*
于 2010-07-30T16:14:03.370 に答える
0

初期化されていないポインターを逆参照しています。 ブロックdelimに入ったときに初期化されることはありません。else

于 2010-07-30T16:14:32.720 に答える
0
char delim[] = ","; // anything really, as long as as it's one character string

...


delim[0] = delimCharacter;
于 2010-07-30T16:15:09.720 に答える
0

あなたの記憶の問題に加えて、あなたは何をするかについて混乱していると思いますatoi。数値の文字列表現を解析し、同等の int 値を返します (例: "10000" => 10,000)。文字の ASCII 値、たとえば "A" =>65 が得られると思われると思います。

がありchar *、単一の文字が含まれていると(私が思うに)想定しているので、次のように簡単に実行できます。

delimCharacter = *(argv[3]);

charただし、この値を変数に割り当てる中間ステップを使用する必要はまったくないようです。最終目標がdelim区切り文字である char を指すようにすることである場合は、これだけで十分です。

delim = argv[3];

これにより、不要なコードが削除されるだけでなく、delim が指す追加のメモリを割り当てる必要がなくなることを意味します。

const char *また、 delimを変更する理由がないと想定しているため、 delim を として宣言します。

于 2010-07-30T16:23:56.553 に答える