【问题标题】:Why puts is not working in the following code?为什么 puts 在以下代码中不起作用?
【发布时间】:2016-11-12 11:38:31
【问题描述】:
#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 in 第二个函数没有?是的,有一个发送完整结构的选项,但我想知道这里出了什么问题。

【问题讨论】:

  • 首先fflush(stdin); 不正确。删除它。
  • 也许在编译所有警告时会有所帮助
  • 当需要同时获取许多字符串变量时,我已经开始使用flush,例如string1,string2和fgets。如果我不使用flash(),字符串的输入很奇怪
  • @EdHeal 如果 OP 不注意警告,则无济于事。是否有任何编译器不会对此代码发出警告?
  • @ekaf Code::Blocks 是 IDE,而不是编译器。您可能正在使用 GCC 作为编译器。

标签: c function struct pass-by-reference puts


【解决方案1】:

你需要这个

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数组的起始地址。

【讨论】:

    【解决方案2】:

    由于以下几个原因,您的程序无法运行:

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

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

    【讨论】:

    • 可能添加开启所有警告。
    • 谢谢你的工作。我还有 2 个问题。首先我没有得到我缺少前向声明的地方 第二为什么第一个 print(struct test *name) {puts(name)} 工作?
    • @ekaf 第一个puts 是偶然的。不幸的是,这在 C 语言中很常见——因为这种语言非常低级,所以一个不正确的程序经常会产生类似于正确输出的东西。这称为未定义行为。
    【解决方案3】:
    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
    

    【讨论】:

    • print((t1.name); 或许print(t1.name);
    • @EdHeal : 谢谢 Ed,一如既往:)
    • 如果我的要求是将其作为参考发送,以便我可以在打印之前对该功能进行更改,该怎么办?
    • 数组在传递给函数时作为函数内部的指针被接受,在函数内部将 name[2] 更改为 S 并没有什么坏处。但是,如果您不希望更改反映在 print 函数之外,则需要为此创建一个新的 char* 分配内存并使用 strcpy 将实际字符串复制到临时字符串,仅更改fn 中的临时字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2021-08-27
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多