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用作函数调用的参数时,它会衰减为 type 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[]=""; ==> 字符 *wday; 并且 void date(datum *d, char wday[]) ==> void date(datum *d, char *wday[]) 可以解决问题!

通常,您需要传递指向指针(或指向数组的指针)的指针,因为您正在改变被调用函数中的输入。如果您只需要在被调用函数中复制字符数组,那么您是否会将指针传递给 char 数组,例如 char *array 或 char array[]。

希望这可以帮助!

于 2014-07-03T05:39:22.863 回答