【问题标题】:Why is this program not printing on my file?为什么这个程序没有打印在我的文件上?
【发布时间】:2019-09-17 22:12:05
【问题描述】:

此代码应该将用户输入的信息打印到文件中,但它所做的只是创建一个空文件...

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

struct room
{
    int room;
    char type[9];
    int cap;
    int price;
}rm;
FILE *k;
int main(){
    struct room rm;
    k=fopen("rooms.txt","w");
    printf("Please enter room number:");
    scanf("%d", rm.room);
    printf("\nPlease enter a description:");
    scanf("%s", rm.type);
    printf("\nPlease enter the room capacity:");
    scanf("%d", rm.cap);
    printf("\nPlease enter the price:");
    scanf("%d", rm.price);
    fprintf(k,"%d\t %s\t %d\t %d\n", rm.room,rm.type,rm.cap,rm.price);
    fclose(k);
}

【问题讨论】:

  • 代码是c语言而不是c#。
  • 我的坏@jdweng!
  • 关于:struct room { int room; char type[9]; int cap; int price; }rm; 这是声明该结构的一个实例,该实例名为:rm。然后在 main() 函数中:struct room rm; 正在声明名为 rm 的结构的另一个实例。强烈建议去掉第一个实例中的rm,所以它只是struct类型的定义,而不是struct的实例
  • OT:将结构中的字段命名为与结构标记名称相同的名称是一种糟糕的编程习惯
  • OT: about:scanf("%s", rm.type); 1) 始终检查返回值,而不是参数值,以确保操作成功。注意:它返回成功输入格式转换的次数。 2) 使用 '%s' 和/或 '%[...]' 输入格式说明符时,始终包含比输入缓冲区长度小 1 的 MAX CHARACTERS 修饰符,因为这些说明符总是将 NUL 字节附加到输入。这也避免了缓冲区溢出和由此产生的未定义行为的任​​何可能性。建议:if( scanf("%8s", rm.type) != 1 ) { // handle error }

标签: c file


【解决方案1】:

这里

struct room
{
    int room;
    char type[9];
    int cap;
    int price;
}rm;

rm.roomrm.caprm.priceint 类型,在扫描用户输入时,您需要提供地址&amp; 来存储一个整数。例如替换这个

scanf("%d", rm.room); /* to store something into rm.room need to provide address */

scanf("%d", &rm.room);

还有这个

scanf("%d", rm.cap); /* address is not provided */
scanf("%d", rm.price); /* address is not provided */

scanf("%d", &rm.cap);
scanf("%d", &rm.price);

还要检查fopen() 的返回类型。例如

k=fopen("rooms.txt","w");
if(k == NULL) {
 /* @TODO error handling */
 fprintf(stderr, "failure message\n");
 return 0;
}

【讨论】:

    【解决方案2】:

    以下建议的代码:

    1. 干净编译
    2. 将 cmets 合并到问题中
    3. 执行所需的功能
    4. 不包括那些内容没有使用的头文件
    5. 正确检查错误
    6. 尊重打印的页面右边距
    7. 避免任何可能的缓冲区溢出和由此产生的未定义行为
    8. 记住对数组的引用会降级为数组第一个字节的地址
    9. 总是将地址作为参数传递给函数:scanf()
    10. 记录包含每个头文件的原因
    11. 将结构的定义与结构的实例分开
    12. 不声明被同名结构的另一个实例“遮蔽”的结构实例
    13. 对函数使用有效签名之一:main()

    现在,建议的代码:

    #include <stdio.h>   // fprintf(), fopen(), fclose(), perror(), scanf()
    #include <stdlib.h>  // EXIT_FAILURE, exit()
    
    struct room
    {
        int room;
        char type[9];
        int cap;
        int price;
    };
    
    
    int main( void )
    {
        struct room rm;
    
        FILE *k = fopen("rooms.txt","w");
        if( !k )
        {
            perror( "fopen rooms.txt for writing failed" );
            exit( EXIT_FAILURE );
        }
    
        printf("Please enter a room number:");
        if( scanf("%d", &rm.room) != 1 )
        {
            fprintf( stderr, 
                     "scanf for -room number- failed\n" );
            fclose( k );
            exit( EXIT_FAILURE );
        }
    
        printf("\nPlease enter a room description:");
        if( scanf("%8s", rm.type) != 1 )
        {
            fprintf( stderr, 
                     "scanf for -room description- failed\n" );
            fclose( k );
            exit( EXIT_FAILURE );
        }
    
        printf("\nPlease enter the room capacity:");
        if( scanf("%d", &rm.cap) != 1 )
        {
            fprintf( stderr, 
                     "scanf for -room capacity- failed\n" );
            fclose( k );
            exit( EXIT_FAILURE );
        }
    
        printf("\nPlease enter the room price:");
        if( scanf("%d", &rm.price) != 1 )
        {
            fprintf( stderr, 
                     "scanf for -room price- failed\n" );
            fclose( k );
            exit( EXIT_FAILURE );
        }
    
        // multi lined parameters to honor right page margin
        fprintf(k,"%d\t %s\t %d\t %d\n", 
            rm.room,
            rm.type,
            rm.cap,
            rm.price);
        fclose(k);
    }
    

    回答 OP 的问题:为什么这个程序没有打印在我的文件上?

    由于scanf()函数参数的语法不正确,发布的代码没有输入任何内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多