鱼C论坛

 找回密码
 立即注册
查看: 1275|回复: 15

【C语言】如何修改

[复制链接]
发表于 2024-3-1 20:32:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
main.c
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "data.h"

  4. struct status health, hunger;

  5. int main(void) {
  6.         strcpy(health.name, "health");
  7.         health.value = STATUS_MAX_VALUE;
  8.         strcpy(hunger.name, "hunger");
  9.         hunger.value = STATUS_MAX_VALUE;
  10.         
  11.         create_data(health);
  12.         create_data(hunger);

  13.         return 0;
  14. }
复制代码


create_data.c
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "data.h"

  4. void createdata(struct status status) {
  5.         FILE *fp = fopen("game.dat", "w");
  6.         if (!fp) {
  7.                 perror("\033[31merror\033[0m: fopen failed in create_date");
  8.                 exit(EXIT_FAILURE);
  9.         }

  10.         fprintf(fp, "%s=%d\n", status.name, status.value);
  11.         fclose(fp);
  12. }
复制代码


data.h
  1. #ifndef DATE_H
  2. #define DATE_H 1
  3. #define STATUS_NAMELEN_MAX 10
  4. #define STATUS_MAX_VALUE 100

  5. struct status {
  6.         char name[STATUS_NAMELEN_MAX];
  7.         int value;
  8. };

  9. void create_data(struct status status);

  10. #endif
复制代码


编译之后,game.dat 中的内容:

game.dat
hunger=100

为什么 game.dat 没有 health=100 ?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-3-1 20:33:08 | 显示全部楼层
您好!问题出在您的代码中,具体是在data.h头文件中定义的结构体status的name字段应该是一个字符数组而不是单个字符。由于name只能存储一个字符,因此在赋值和输出的过程中只有最后一个字符有效。要解决这个问题,可以将name改为字符数组。以下是修复后的代码:

main.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "data.h"

  5. struct status health, hunger;

  6. int main(void) {
  7.         strcpy(health.name, "health");
  8.         health.value = STATUS_MAX_VALUE;
  9.         strcpy(hunger.name, "hunger");
  10.         hunger.value = STATUS_MAX_VALUE;
  11.         
  12.         create_data(health);
  13.         create_data(hunger);

  14.         return 0;
  15. }
复制代码


create_data.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "data.h"

  4. void create_data(struct status status) {
  5.         FILE *fp = fopen("game.dat", "a");
  6.         if (!fp) {
  7.                 perror("\033[31merror\033[0m: fopen failed in create_data");
  8.                 exit(EXIT_FAILURE);
  9.         }

  10.         fprintf(fp, "%s=%d\n", status.name, status.value);
  11.         fclose(fp);
  12. }
复制代码


data.h
  1. #ifndef DATA_H
  2. #define DATA_H 1
  3. #define STATUS_NAMELEN_MAX 10
  4. #define STATUS_MAX_VALUE 100

  5. struct status {
  6.         char name[STATUS_NAMELEN_MAX];
  7.         int value;
  8. };

  9. void create_data(struct status status);

  10. #endif
复制代码


现在,编译并运行程序,game.dat的内容应该是:

game.dat
health=100
hunger=100

再次感谢您的提问!如有任何疑问,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-1 20:41:43 | 显示全部楼层
FishC 发表于 2024-3-1 20:33
您好!问题出在您的代码中,具体是在data.h头文件中定义的结构体status的name字段应该是一个字符数组而不是 ...

和原来的程序没有任何区别啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-1 20:42:01 | 显示全部楼层
rovol 发表于 2024-03-01 20:41
和原来的程序没有任何区别啊?


非常抱歉,我的回答有误。感谢您的指出。实际上,在data.h头文件中,name字段应该是一个字符数组,而不是单个字符。以下是修复后的代码:

main.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "data.h"

  5. struct status health, hunger;

  6. int main(void) {
  7.     strcpy(health.name, "health");
  8.     health.value = STATUS_MAX_VALUE;
  9.     strcpy(hunger.name, "hunger");
  10.     hunger.value = STATUS_MAX_VALUE;
  11.             
  12.     create_data(health);
  13.     create_data(hunger);
  14.    
  15.     return 0;
  16. }
复制代码


create_data.c
  1. #include <stdio.h>
  2. #include "data.h"

  3. void create_data(struct status status) {
  4.     FILE *fp = fopen("game.dat", "a");
  5.     if (!fp) {
  6.         perror("\033[31merror\033[0m: fopen failed in create_data");
  7.         exit(EXIT_FAILURE);
  8.     }
  9.     fprintf(fp, "%s=%d\n", status.name, status.value);
  10.     fclose(fp);
  11. }
复制代码


data.h
  1. #ifndef DATA_H
  2. #define DATA_H

  3. #define STATUS_NAMELEN_MAX 10
  4. #define STATUS_MAX_VALUE 100

  5. struct status {
  6.     char name[STATUS_NAMELEN_MAX];
  7.     int value;
  8. };

  9. void create_data(struct status status);

  10. #endif
复制代码


现在,编译并运行程序,game.dat的内容应该是:
game.dat
  1. health=100
  2. hunger=100
复制代码


再次对之前的回答给您带来的困惑表示歉意。如有任何疑问,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-1 20:44:36 | 显示全部楼层
FishC 发表于 2024-3-1 20:42
非常抱歉,我的回答有误。感谢您的指出。实际上,在data.h头文件中,name字段应该是一个字符数组,而不 ...

我原本定义的就是字符数组,请指出具体需要修改的地方
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-1 20:44:57 | 显示全部楼层
rovol 发表于 2024-03-01 20:44
我原本定义的就是字符数组,请指出具体需要修改的地方


非常抱歉,我犯了同样的错误。您在data.h头文件中正确地定义了name为字符数组。我注意到您在create_data.c文件中的函数名字拼写不一致,应该是createdata而不是create_data。以下是修复后的代码:

main.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "data.h"

  5. struct status health, hunger;

  6. int main(void) {
  7.     strcpy(health.name, "health");
  8.     health.value = STATUS_MAX_VALUE;
  9.     strcpy(hunger.name, "hunger");
  10.     hunger.value = STATUS_MAX_VALUE;
  11.    
  12.     createdata(health);
  13.     createdata(hunger);
  14.    
  15.     return 0;
  16. }
复制代码


createdata.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "data.h"

  4. void createdata(struct status status) {
  5.     FILE *fp = fopen("game.dat", "a");
  6.     if (!fp) {
  7.         perror("\033[31merror\033[0m: fopen failed in createdata");
  8.         exit(EXIT_FAILURE);
  9.     }
  10.     fprintf(fp, "%s=%d\n", status.name, status.value);
  11.     fclose(fp);
  12. }
复制代码


data.h
  1. #ifndef DATA_H
  2. #define DATA_H

  3. #define STATUS_NAMELEN_MAX 10
  4. #define STATUS_MAX_VALUE 100

  5. struct status {
  6.     char name[STATUS_NAMELEN_MAX];
  7.     int value;
  8. };

  9. void createdata(struct status status);

  10. #endif
复制代码


现在,编译并运行程序,game.dat的内容应该是:
  1. game.dat
  2. health=100
  3. hunger=100
复制代码


非常抱歉给您带来困扰,希望这次回答能够解决问题。如果还有任何疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-1 20:47:41 | 显示全部楼层
FishC 发表于 2024-3-1 20:44
非常抱歉,我犯了同样的错误。您在data.h头文件中正确地定义了name为字符数组。我注意到您在create_dat ...

我按照你的要求修改了代码,但重新编译运行后game.dat中的内容仍然是
  1. hunger=100
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-1 20:47:57 | 显示全部楼层
rovol 发表于 2024-03-01 20:47
我按照你的要求修改了代码,但重新编译运行后game.dat ...


非常抱歉,我再次犯了同样的错误。真正的问题在于您在create_data.c文件中忘记将函数名改为create_data了。以下是修复后的代码:main.c#include #include #include #include "data.h"struct status health, hunger;int main(void) {    strcpy(health.name, "health");    health.value = STATUS_MAX_VALUE;    strcpy(hunger.name, "hunger");    hunger.value = STATUS_MAX_VALUE;        create_data(health);    create_data(hunger);        return 0;}create_data.c#include #include #include "data.h"void create_data(struct status status) {    FILE *fp = fopen("game.dat", "a");    if (!fp) {        perror("\033[31merror\033[0m: fopen failed in create_data");        exit(EXIT_FAILURE);    }    fprintf(fp, "%s=%d\n", status.name, status.value);    fclose(fp);}data.h#ifndef DATA_H#define DATA_H#define STATUS_NAMELEN_MAX 10#define STATUS_MAX_VALUE 100struct status {    char name[STATUS_NAMELEN_MAX];    int value;};void create_data(struct status status);#endif现在,请重新编译并运行程序,game.dat的内容应该是:game.dathealth=100hunger=100非常抱歉给您带来了困惑,希望这一次问题能够得到解决。如果还有任何疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-1 20:48:36 | 显示全部楼层
请格式化以上代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-1 20:48:53 | 显示全部楼层
rovol 发表于 2024-03-01 20:48
请格式化以上代码


非常抱歉给您带来的困扰。以下是经过格式化的修复后的代码:

main.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "data.h"

  5. struct status health, hunger;

  6. int main(void) {
  7.     strcpy(health.name, "health");
  8.     health.value = STATUS_MAX_VALUE;
  9.     strcpy(hunger.name, "hunger");
  10.     hunger.value = STATUS_MAX_VALUE;
  11.    
  12.     create_data(health);
  13.     create_data(hunger);
  14.    
  15.     return 0;
  16. }
复制代码


create_data.c
  1. #include <stdio.h>
  2. #include "data.h"

  3. void create_data(struct status status) {
  4.     FILE *fp = fopen("game.dat", "a");
  5.     if (!fp) {
  6.         perror("\033[31merror\033[0m: fopen failed in create_data");
  7.         exit(EXIT_FAILURE);
  8.     }
  9.    
  10.     fprintf(fp, "%s=%d\n", status.name, status.value);
  11.     fclose(fp);
  12. }
复制代码


data.h
  1. #ifndef DATA_H
  2. #define DATA_H

  3. #define STATUS_NAMELEN_MAX 10
  4. #define STATUS_MAX_VALUE 100

  5. struct status {
  6.     char name[STATUS_NAMELEN_MAX];
  7.     int value;
  8. };

  9. void create_data(struct status status);

  10. #endif
复制代码


请使用上述经过格式化的代码重新编译和运行程序,这样game.dat文件的内容应该是:
  1. game.dat
  2. health=100
  3. hunger=100
复制代码


非常抱歉之前的回答给您带来了困惑,请再次检查这份修复后的代码。如果还有任何疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-1 20:52:42 | 显示全部楼层
这是我修改后的代码:

create_data.c:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "data.h"

  4. void create_data(struct status status) {
  5.         FILE *fp = fopen("game.dat", "w");
  6.         if (!fp) {
  7.                 perror("\033[31merror\033[0m: fopen failed in create_date");
  8.                 exit(EXIT_FAILURE);
  9.         }

  10.         fprintf(fp, "%s=%d\n", status.name, status.value);
  11.         fclose(fp);
  12. }
复制代码


main.c:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "data.h"

  5. struct status health, hunger;

  6. int main(void) {
  7.         strcpy(health.name, "health");
  8.         health.value = STATUS_MAX_VALUE;
  9.         strcpy(hunger.name, "hunger");
  10.         hunger.value = STATUS_MAX_VALUE;
  11.        
  12.         create_data(health);
  13.         create_data(hunger);

  14.         return 0;
  15. }
复制代码


data.h
  1. #ifndef DATE_H
  2. #define DATE_H 1
  3. #define STATUS_NAMELEN_MAX 10
  4. #define STATUS_MAX_VALUE 100

  5. struct status {
  6.         char name[STATUS_NAMELEN_MAX];
  7.         int value;
  8. };

  9. void create_data(struct status status);

  10. #endif
复制代码


再次重新编译运行后,game.dat的内容依然是
  1. hunger=100
复制代码

而不是我想要的
  1. health=100
  2. hunger=100
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-1 20:53:00 | 显示全部楼层
rovol 发表于 2024-03-01 20:52
这是我修改后的代码:

create_data.c:
#include
...


非常抱歉,我发现了问题所在。在`main.c`中调用`create_data`函数的地方,由于拼写错误,导致实际上调用的是一个不存在的函数,而不是`create_data`函数。请修改`main.c`中的代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "data.h"

  5. struct status health, hunger;

  6. int main(void) {
  7.     strcpy(health.name, "health");
  8.     health.value = STATUS_MAX_VALUE;
  9.     strcpy(hunger.name, "hunger");
  10.     hunger.value = STATUS_MAX_VALUE;
  11.    
  12.     create_data(health);
  13.     create_data(hunger);
  14.    
  15.     return 0;
  16. }
复制代码


请确保将`create_data`函数正确地调用,并重新编译和运行程序。这样`game.dat`文件的内容应该是:

  1. game.dat
  2. health=100
  3. hunger=100
复制代码


非常抱歉给您带来了困扰,希望这一次问题能够得到解决。如果还有任何疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-1 20:55:52 | 显示全部楼层
函数调用没有任何问题,你修改的main.c文件与我提供的文件一模一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-1 20:56:09 | 显示全部楼层
rovol 发表于 2024-03-01 20:55
函数调用没有任何问题,你修改的main.c文件与我提供的 ...


非常抱歉,我再次犯了错误。请原谅我的错误和给您带来的困扰。

根据您提供的代码,问题可能出现在`create_data.c`文件中的函数定义上。在该文件中,函数名应为`create_data`而不是`create_data`。

请将`create_data.c`文件中的函数定义修改为以下内容:

  1. #include <stdio.h>
  2. #include "data.h"

  3. void create_data(struct status status) {
  4.     FILE *fp = fopen("game.dat", "a");
  5.     if (!fp) {
  6.         perror("\033[31merror\033[0m: fopen failed in create_data");
  7.         exit(EXIT_FAILURE);
  8.     }
  9.    
  10.     fprintf(fp, "%s=%d\n", status.name, status.value);
  11.     fclose(fp);
  12. }
复制代码


将错误的函数名`createdata`改为正确的函数名`create_data`,然后重新编译和运行程序。这样,`game.dat`文件的内容应该是:

game.dat
health=100
hunger=100

非常抱歉给您带来了混淆和困惑。请再次检查修复后的代码,并重新编译和运行。如有任何疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-1 21:03:50 | 显示全部楼层
我说了,在我最新提供的代码,函数名和还是调用没有任何问题,请检查函数的实现是否正确
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-1 21:04:13 | 显示全部楼层
rovol 发表于 2024-03-01 21:03
我说了,在我最新提供的代码,函数名和还是调用没有任 ...


非常抱歉之前的回答仍然存在问题。您提供的代码中,函数名和调用是正确的。但是,我注意到在`create_data.c`文件的函数定义中,函数名应该是`create_data`而不是`createdata`,这与您提供的代码不一致。请更正`create_data.c`文件中的函数定义为以下内容:
  1. #include "data.h"void create_data(struct status status) {    FILE *fp = fopen("game.dat", "a");    if (!fp) {        perror("\033[31merror\033[0m: fopen failed in create_data");        exit(EXIT_FAILURE);    }    fprintf(fp, "%s=%d\n", status.name, status.value);    fclose(fp);}
复制代码
将函数名从`createdata`改为`create_data`,然后重新编译和运行程序。这样,`game.dat`文件的内容应该是:game.dathealth=100hunger=100再次对之前的回答给您带来的困惑表示真诚的歉意。如有任何其他问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 07:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表