代码返回地址

时间:2016-12-29 09:32:25

标签: c

我目前正在家里学习C(已经从大学了解java)。 我只是试图运行一些基本功能,但似乎我得到的是adrees而不是值...

#include <stdio.h>

int getDepartureDate (int day, int month, int year); 

int getReturningDate (int retDay, int retMonth, int retYear);

int getNoOfCountries (int countries);

int getNoOfTravellers (int noOfTravellers);

int main() {

    int day; int month; int year; int retDay; int retYear; int retMonth; int countries; int travellers;
    printf("Please enter the departure date");
    scanf("%d %d %d",&day,&month,&year);
    printf("Please enter the returning date:");
    scanf("%d %d %d",&retDay,&retMonth,&retYear);
    printf("Please enter the number of countries:");
    scanf("%d",&countries);
    printf("Please enter the number of travellers:");
    scanf("%d",&travellers);
    printf("Your information is: \n");
    printf("Your departure date is: %d \n",&getDepartureDate);
    printf("Your returning date is: %d \n",&getReturningDate);
    printf("Your number of countries are: %d \n",&getNoOfCountries);
    printf("Your number of travellers is: %d \n",&getNoOfTravellers);
    return 0;
}


int getDepartureDate (int day, int month, int year)
{

return ("%d %d %d",&day,&month,&year);
}

int getReturningDate (int retDay, int retMonth, int retYear)
  {

return ("%d %d %d",&retDay,&retMonth,&retYear);
  }

  int getNoOfCountries (int noOfCountries)
  {

return ("%d",&noOfCountries);
  }

  int getNoOfTravellers (int noOfTravellers)
  {

return ("%d",&noOfTravellers);
  }

注意:我也尝试使用类似的功能:

printf(&#34;您的出发日期是:%d \ n&#34;,&amp; getDepartureDate(日,月,年));

因此,当我运行该程序时,它返回: 您的出发日期是:45687,类似于所有方法。 也许它不可能在C中以这种方式使用getter?

3 个答案:

答案 0 :(得分:2)

&getDepartureDategetDepartureDate就此而言是函数指针

printf的参数通常不是指针,而是值。同样重要的是要注意参数类型必须与格式说明符完全匹配否则整个程序的行为将未定义

你的意思是

printf("Your departure date is: %d \n", getDepartureDate(day, month, year));

等?请注意,我已将参数提供给函数getDepartureDate

答案 1 :(得分:1)

  

也许在C中以这种方式使用getter是不可能的?

不,不可能那样做。

有些事情你似乎被误解了,所以我会试着解释一下。

1)返回一个字符串

从您的代码中,您似乎希望函数返回带有相关信息的带格式的文本字符串。

为了做到这一点,你必须返回一个char*(char指针),因为C中的字符串是一个零终止的char数组,你可以使用char指针来引用它。

所以使用

char* getDepartureDate(....)
{

    return SomeCharPointer;
}  

2)构建格式化字符串

有几种方法可以构建格式化字符串。一个简单的方法是sprintf。它的工作方式与printf几乎相同,只是它需要char*作为第一个参数。 char*应指向足够大的char数组的位置以保存格式化的字符串(请参阅end-note)。

所以你需要a)创建一个char数组,然后b)使用sprintf

再次 - 它可以通过多种方式完成 - 但为了简单起见,您可以在main中创建char数组并传递给函数。

int main() {
  char str[128];

  ....
  return 0;
}

char* getDepartureDate (char* str, int day, int month, int year)
{
  sprintf(str, "%d %d %d", day, month, year);
  return str;
}

3)调用函数

在您的代码中,您尝试调用&getDepartureDate

之类的函数

这不是正确的方法。相反,你写

functionName(argument1, argument2, ......)

所以要调用类似的函数:

char* getDepartureDate (char* str, int day, int month, int year)
你可以这样做:

char s[128];
int d=29;
int m=12;
int y = 2016
getDepartureDate (s, d, m, y);

请注意,调用时使用的变量名称不必与函数原型中的变量名称匹配。它只是需要匹配的类型。

4)printf格式说明符

使用printf(以及sprintf和其他朋友)时,使用正确的格式说明符非常重要。

您使用%d但是用于打印整数。

要打印字符串,您必须使用%s

全部放在一起

因此,使用上述指南重写代码将为您提供:

#include<stdio.h>

char* getDepartureDate (char* str, int day, int month, int year);

char* getReturningDate (char* str, int retDay, int retMonth, int retYear);

char* getNoOfCountries (char* str, int countries);

char* getNoOfTravellers (char* str, int noOfTravellers);

int main() {
  char str[128];

  int day; int month; int year; int retDay; int retYear; int retMonth; int countries; int travellers;
  printf("Please enter the departure date");
  scanf("%d %d %d",&day,&month,&year);
  printf("Please enter the returning date:");
  scanf("%d %d %d",&retDay,&retMonth,&retYear);
  printf("Please enter the number of countries:");
  scanf("%d",&countries);
  printf("Please enter the number of travellers:");
  scanf("%d",&travellers);

  printf("Your information is: \n");
  printf("Your departure date is: %s \n", getDepartureDate(str, day, month, year));
  printf("Your returning date is: %s \n", getReturningDate(str, retDay, retMonth, retYear));
  printf("Your number of countries are: %s \n", getNoOfCountries(str, countries));
  printf("Your number of travellers is: %s \n", getNoOfTravellers(str, travellers));
  return 0;
}


char* getDepartureDate (char* str, int day, int month, int year)
{
  sprintf(str, "%d %d %d", day, month, year);
  return str;
}

char* getReturningDate (char* str, int day, int month, int year)
{
  sprintf(str, "%d %d %d", day, month, year);
  return str;
}

char* getNoOfCountries (char* str, int noOfCountries)
{
  sprintf(str, "%d", noOfCountries);
  return str;
}

char* getNoOfTravellers (char* str, int noOfTravellers)
{
  sprintf(str, "%d", noOfTravellers);
  return str;
}

<强>最终注释

通常必须小心使用sprint,因为如果char数组对于格式化文本来说太小,则会发生缓冲区溢出。相反,您可以查看snprintf,因为它可以指定最大尺寸。

另请注意,在不检查返回值的情况下使用scanf通常是不好的。因此,而不是scanf("%d %d %d",&day,&month,&year)做:

if (scanf("%d %d %d",&day,&month,&year) != 3)
{
    // ERROR - Input was not 3 integers
    ... add error handling ...
}

答案 2 :(得分:0)

你的功能并没有真正发挥作用。您只需删除它们并使用以下代码即可。

int main() {

    int day; int month; int year; int retDay; int retYear; int retMonth; int countries; int travellers;
    printf("Please enter the departure date");
    scanf("%d %d %d",&day,&month,&year);
    printf("Please enter the returning date:");
    scanf("%d %d %d",&retDay,&retMonth,&retYear);
    printf("Please enter the number of countries:");
    scanf("%d",&countries);
    printf("Please enter the number of travellers:");
    scanf("%d",&travellers);
    printf("Your information is: \n");
    printf("Your departure date is: %d \n",Day);
    printf("Your returning date is: %d \n",retDay);
    printf("Your number of countries are: %d \n",countries);
    printf("Your number of travellers is: %d \n",travellers);
    return 0;
}