为什么 puts 在以下代码中不起作用?

Why puts is not working in the following code?

#include <stdio.h>
#include <stdlib.h>

struct test
{
    int id;
    char name[20];
};

int main()
{

struct test t1;

   t1.id=1;
   fflush(stdin);
   fgets(t1.name,20,stdin);

   print((&t1.name));          
   print1(t1.id,&(t1.name));    

}
void print(struct test *name)
{
    puts(name);
}

void print1(struct test id,struct test *name)
{

    printf("\n%d\n",id);


    puts(name);
}

当我 运行 这个程序要求输入时

测试[进入]

输出出来

测试 1个 (然后程序终止)

为什么第一个 puts 起作用而第二个 puts 不起作用?是的,有发送完整结构的选项,但我想知道这里有什么问题。

你需要这个

void print(char *name)
{
    puts(name);
}

调用需要

print(t1.name);         

puts需要char *(或者实际上是const char *)。

t1.name 具有数据类型 char *

同样

void print1(struct test id, char *name)
{

    printf("\n%d\n",id);


    puts(name);
}

和通话

print1(t1.id,& t1.name);    

数组名退化为数组首元素地址。所以当t1.name传给函数时,就变成了char数组的起始地址。

您的程序不工作有几个原因:

  • 您正在调用缺少前向声明的函数 - 您应该在程序编译时看到警告。不要忽视他们
  • 您的函数采用的参数类型不正确 - 您应该收到与各个字段相对应的类型,例如void print1(int id, char *name) 或者你应该通过值或指针传递整个结构,即 void print1(struct test t)

一旦你解决了这两个问题,并确保你的程序编译时没有警告,并且启用了所有编译器警告,问题就应该解决了。

void print(struct test *name)

应该改为

void print(char name[]) // because you wish to print a null terminated array of characters.


 print((&t1.name)); 

应该改为

print(t1.name); //name is the array you wish to print