1

ここのコードに問題があります。私のコードがすべきことは、ビットフィールドを平日に割り当てることです。たとえば、月曜日は 0x00、火曜日は 0x01 などです。これが私のコードです:

    #include<stdio.h>

typedef struct
{
  unsigned int week:3;
  unsigned int month:4;
}datum;

void date(datum *d, char wday[])
{
  switch(d->week)
    {
    case 0x00:
     *wday = "Monday";
      break;
    case 0x01:
     *wday = "Tuesday";
      break;
    default:
      printf("Unknown option: %i\n", d->week);
    }
}

int main()
{
  char wday[]="";
  datum now = {0x01, 0x05};
  date(&now,&wday);
  printf("It's %s\n", wday);
  return 0;
}

この時点で、コードを実行するときに (そして、少なくともコンパイルできれば) コードが行うべきことは次のとおりです。

月曜日です

残念ながら、それはコンパイルされないか、または「It's -88」などのポインターを変更すると表示されます。問題は、char wday への char ポインターにあると思います。しかし、コードを機能させる方法がわかりません。

C-Rookieを助けてくれてありがとう。

4

3 に答える 3

1

コードに次の問題があります。

  1. 台詞

     *wday = "Monday";
    

     *wday = "Tuesday";
    

    合法ではありません。これは、C で文字列を割り当てる方法ではありません。以下を使用する必要があります。

    strcpy(wday, "Monday");
    

    strcpy(wday, "Tuesday");
    

    必ず追加してください

    #include <string.h>
    

    使用するstrcpy

  2. 次の行があります。

    char wday[]="";
    

    への呼び出しで使用していますdate。またはwdayを保持するのに十分なメモリがありません。日付を保持するのに十分な大きさで宣言する必要があります。次のように変更します。MondayTuesday

    char wday[50];
    

    動作するはずです。

  3. 次の行があります。

    date(&now,&wday);
    

    必要なのは

    date(&now, wday);
    

    wday関数呼び出しの引数として使用すると、型に減衰しchar*ます。を使えば&wdayになりchar**ます。それはあなたがここで必要とするものではありません。が必要ですchar*。関数dateでは、引数char wday[]は と同じchar* wdayです。

于 2014-06-30T01:08:29.350 に答える
1

質問コードは機能に非常に近いです。


変化する:

void date(datum *d, char wday[])

に:

void date(datum *d, char **wday)

変化する:

char wday[]="";

に:

char *wday="";

これらの変更後、警告やエラーなしでコンパイルされ、期待どおりに実行されます。

SLES11SP2:~/SO> gcc -Wall -o test *.c
SLES11SP2:~/SO> ./test
It's Tuesday
SLES11SP2:~/SO>
于 2014-06-30T01:08:32.943 に答える
0

char wday[]=""; の変更 ==> char *wday; そして void date(datum *d, char *wday[]) ==> void date(datum *d, char *wday[]) でうまくいきます!

一般に、呼び出された関数で入力を変更しているため、ポインターへのポインター (または配列へのポインター) を渡す必要があります。呼び出された関数でのみ文字配列のコピーが必要な場合は、この char *array または char array[] のように char 配列へのポインターを渡します。

お役に立てれば!

于 2014-07-03T05:39:22.863 に答える