-4

如何在一个函数中返回字符串或数字。

如:

int main()
{
    printf("%s",rawinput("What is your name: ", "s"));
    printf("%d", rawinput("How old are you: ", "n"));
}

([int] or [char *]) rawinput(char *message, char *type)
{

if(!strcmp(type,"n")){
  int value;
  scanf("%d",&value);
  return value;}
else if(!strcmp(type, "s")){
  char *value[1024];
  fgets(value,1024,stdin);
  return value;}
}

请注意,定义 rawinput 函数的方式会有所不同。

4

2 回答 2

0

不要那样做。有一种方法,但这是一种不好的做法,您不应该使用它。这是一个更好的选择:

typedef union RAWINPUT_UNION
{
    char *string;
    int integer;
}RAWINPUT;

RAWINPUT rawinput(char *message, char *type)
{
    char *resultstring
    int resultinteger;
    RAWINPUT ri;

    // Blah blah blah some code here.

    if(type[0] == 's')
        ri.string = resultstring;
    else if(type[0] == 'i')
        ri.integer = resultinteger;

    return ri;
}

不好的方法是:您可以对指针执行整数运算,并将变量存储在其中,因为指针实际上是整数,只是在编译器中有一个令人上瘾的抽象层。

于 2013-09-05T17:19:25.443 回答
0

鉴于返回值需要是char *in oneprintf("%s",...intint printf("%d", ...函数的返回类型应与格式说明符匹配,并且在调用之间有所不同以避免未定义行为(UB)。让我们使用:

typedef struct {
  union {
    char *s;
    int i;
  } u;
  char type;
} raw_t;

raw_t rawinput(const char *message, char type) {
  raw_t r;
  printf("%s", message);
  r.type = type;
  switch (type) {
  case 'n':
    if (1 != scanf("%d", &r.u.i)) {
      ; // handle error;
    }
    break;
  case 's': {
    char tmp[1024];
    if (1 != scanf("%1023s", tmp)) {
      ; // handle error;
    }
    r.u.s = strdup(tmp);
    break;
    }
  default:
    ; // handle error;
  }
  return r;
}

int main() {
  printf("%s\n", rawinput("What is your name: ", 's').u.s); // Note .u.s
  printf("%d\n", rawinput("How old are you: "  , 'n').u.i); // Note .u.i
  return 0;
}

注意printf("%s....

于 2013-09-23T19:41:59.707 回答