【问题标题】:Problems with using char-pointers使用字符指针的问题
【发布时间】:2014-06-30 00:47:52
【问题描述】:

我对这里的这段代码有疑问。我的代码应该做的是将位域分配给工作日。例如,星期一为 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。

【问题讨论】:

  • 您需要更多时间学习 C 语言和指针。
  • 看看你是如何定义 wday 的。它在哪里分配?这应该可以帮助您成功编译。
  • 你需要看看Pointers。这是一个老歌,但一个非常彻底的好东西。 (还有一个.pdf)

标签: c string-literals char-pointer


【解决方案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*。如果您使用&amp;wday,它将变为char**。这不是你在这里需要的。你需要一个char*。在函数date中,参数char wday[]char* wday相同。

【讨论】:

    【解决方案2】:

    问题代码非常接近功能性;


    变化:

    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>
    

    【讨论】:

      【解决方案3】:

      改变 字符 wday[]=""; ==> 字符 *wday; 和 无效日期(基准 *d,字符 wday[])==> 无效日期(基准 *d,字符 *wday[]) 会成功的!

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

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多