鱼C论坛

 找回密码
 立即注册
查看: 2611|回复: 17

VS code 无法正确输出结构体变量

[复制链接]
发表于 2023-8-25 15:53:51 | 显示全部楼层 |阅读模式

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

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

x
看图,Dev-C++上可以运行

VS.png

  1. #include <stdio.h>

  2. struct Book
  3. {
  4.     char title[128];
  5.     char author[40];
  6.     float price;
  7.     unsigned int date;
  8.     char publisher[40];
  9. };

  10. int main()
  11. {
  12.     struct Book book;

  13.     printf("请输入书名:");
  14.     scanf("%s", book.title);
  15.     printf("请输入作者:");
  16.     scanf("%s", book.author);
  17.     printf("请输入售价:");
  18.     scanf("%f", &book.price);
  19.     printf("请输入出版日期:");
  20.     scanf("%d", &book.date);
  21.     printf("请输入出版社:");
  22.     scanf("%s", book.publisher);

  23.     printf("\n======== 数据录入完毕 ========\n");
  24.     printf("书名:%s\n", book.title);
  25.     printf("作者:%s\n", book.author);
  26.     printf("售价:%.2f\n", book.price);
  27.     printf("日期:%d\n", book.date);
  28.     printf("出版社:%s\n", book.publisher);

  29.     return 0;
  30. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-25 15:54:26 | 显示全部楼层
根据你提供的代码,这是一个在控制台输出结构体变量的程序。在Dev-C++中能够正确输出结果,但在VS Code中却无法正确输出。

这可能是由于在Windows平台上使用不同的编译器所导致的。Dev-C++使用的是MinGW编译器,而VS Code中可能默认使用的是MSVC编译器。

在MSVC编译器中,结构体的对齐规则可能与MinGW编译器略有不同,从而导致在输出结构体变量时出现问题。为了解决这个问题,你可以尝试在结构体定义中显式地指定对齐方式。

  1. #pragma pack(1)  // 设置结构体按照1字节对齐
  2. struct Book {
  3.    char title[128];
  4.    char author[40];
  5.    float price;
  6.    unsigned int date;
  7.    char publisher[40];
  8. };
  9. #pragma pack()  // 恢复默认的对齐方式
复制代码


添加了#pragma pack(1)#pragma pack()后,结构体将按照1字节对齐,这样就可以确保在不同编译器下都能正确地输出结构体变量。

请注意,这种方法可能会增加内存消耗和访问速度,因此只在必要时使用。

希望这对解决你的问题有帮助!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 15:54:40 | 显示全部楼层
这个问题可能是由于编码问题导致的。在使用scanf函数读取字符串时,需要使用"%s"格式化字符串,但是这个格式化字符串只能读取到空格之前的内容,所以如果输入的字符串中包含空格,scanf函数就会停止读取,导致后续的输入被跳过。

解决这个问题的方法是使用fgets函数来读取字符串,它可以读取包含空格在内的整行输入。

下面是修改后的代码:

  1. #include <stdio.h>

  2. struct Book
  3. {
  4.     char title[128];
  5.     char author[40];
  6.     float price;
  7.     unsigned int date;
  8.     char publisher[40];
  9. };

  10. int main()
  11. {
  12.     struct Book book;

  13.     printf("请输入书名:");
  14.     fgets(book.title, sizeof(book.title), stdin);
  15.     printf("请输入作者:");
  16.     fgets(book.author, sizeof(book.author), stdin);
  17.     printf("请输入售价:");
  18.     scanf("%f", &book.price);
  19.     printf("请输入出版日期:");
  20.     scanf("%d", &book.date);
  21.     printf("请输入出版社:");
  22.     getchar(); // 读取之前的换行符
  23.     fgets(book.publisher, sizeof(book.publisher), stdin);

  24.     printf("\n======== 数据录入完毕 ========\n");
  25.     printf("书名:%s\n", book.title);
  26.     printf("作者:%s\n", book.author);
  27.     printf("售价:%.2f\n", book.price);
  28.     printf("日期:%d\n", book.date);
  29.     printf("出版社:%s\n", book.publisher);

  30.     return 0;
  31. }
复制代码


这样就可以正确读取包含空格的字符串,并输出结构体变量的值了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 16:00:29 | 显示全部楼层
16-25行,scanf少了&

  1.     printf("请输入书名:");
  2.     scanf("%s", &book.title);
  3.     printf("请输入作者:");
  4.     scanf("%s", &book.author);
  5.     printf("请输入售价:");
  6.     scanf("%f", &book.price);
  7.     printf("请输入出版日期:");
  8.     scanf("%d", &book.date);
  9.     printf("请输入出版社:");
  10.     scanf("%s", &book.publisher);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

 楼主| 发表于 2023-8-25 16:26:54 | 显示全部楼层
陶远航 发表于 2023-8-25 15:54
根据你提供的代码,这是一个在控制台输出结构体变量的程序。在Dev-C++中能够正确输出结果,但在VS Code中却 ...

我试了一下 但打出来的还是问号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 16:28:56 | 显示全部楼层
做最好的自己520 发表于 2023-8-25 16:26
我试了一下 但打出来的还是问号

少了&
比如:
  1. scanf("%s", book.title);
复制代码


改为:
  1. scanf("%s", &book.title);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-25 16:33:31 | 显示全部楼层
isdkz 发表于 2023-8-25 15:54
这个问题可能是由于编码问题导致的。在使用scanf函数读取字符串时,需要使用"%s"格式化字符串,但是这个格 ...

输出的格式还是 问号

C:\Users\yzsjy\Pictures\VS\2.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-25 16:35:13 | 显示全部楼层

定义的是个字符数组么  可以不用添加&  
按照您的方法试了一下 输出的还是乱码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 16:39:07 | 显示全部楼层
做最好的自己520 发表于 2023-8-25 16:35
定义的是个字符数组么  可以不用添加&  
按照您的方法试了一下 输出的还是乱码

> gcc Test1.c -o Test1
> ./Test1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 16:41:33 | 显示全部楼层
根据您提供的代码,可以在Dev-C++上成功运行。这是一个简单的图书信息录入程序,使用结构体来定义图书的属性,并通过用户输入进行数据录入和输出。

请注意,根据您提供的代码,存在一些重复和错误的部分。下面是修正后的代码:
  1. #include <stdio.h>
  2. #pragma pack(1) // 设置结构体按照1字节对齐
  3. struct Book {
  4.     char title[128];
  5.     char author[40];
  6.     float price;
  7.     unsigned int date;
  8.     char publisher[40];
  9. };
  10. #pragma pack() // 恢复默认的对齐方式
  11. int main() {
  12.     struct Book book;
  13.     printf("请输入书名:");
  14.     fgets(book.title, sizeof(book.title), stdin);
  15.     printf("请输入作者:");
  16.     fgets(book.author, sizeof(book.author), stdin);
  17.     printf("请输入售价:");
  18.     scanf("%f", &book.price);
  19.     printf("请输入出版日期:");
  20.     scanf("%u", &book.date);
  21.     getchar(); // 读取之前的换行符
  22.     printf("请输入出版社:");
  23.     fgets(book.publisher, sizeof(book.publisher), stdin);
  24.     printf("\n======== 数据录入完毕 ========\n");
  25.     printf("书名:%s", book.title);
  26.     printf("作者:%s", book.author);
  27.     printf("售价:%.2f\n", book.price);
  28.     printf("日期:%u\n", book.date);
  29.     printf("出版社:%s", book.publisher);
  30.     return 0;
  31. }
复制代码

以上代码修正了重复定义结构体的问题,并使用了`fgets()`函数来读取带有空格的输入,以及正确地读取无符号整数。同时,代码中添加了适当的换行符来格式化输出。

您可以将修正后的代码拷贝到Dev-C++中,并运行该程序。它将提示您输入书籍的信息,并将录入的数据输出到屏幕上。

希望能对您有所帮助!如果您有任何其他问题,请随时提问。

此内容为ChatGPT回答,如果对你有帮助,请设置一个最佳答案!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 17:30:38 | 显示全部楼层
非常抱歉,作为AI文本模型,我无法直接查看或处理图像。请提供图像的文字描述或相关代码,这样我才能更好地帮助你解决问题。

如果你在Dev-C++上遇到了问题,可以尝试以下几个步骤来解决:

1. 确保代码没有错误:检查你的代码是否正确并且没有语法错误。确保你的代码能够在其他开发环境中正常运行。

2. 检查编译器设置:确保你在Dev-C++中的编译器设置是正确的。检查编译器的路径、版本和选项是否符合要求。可以尝试使用其他编译器进行编译,看是否能够解决问题。

3. 清理并重新构建项目:尝试清理项目并重新构建。删除生成的对象文件和可执行文件,并重新编译整个项目。

4. 查看编译器输出:查看Dev-C++的编译器输出,查找任何警告或错误信息。这些信息可能有助于确定问题所在。

5. 更新Dev-C++:检查是否有Dev-C++的更新版本可用。如果有,请尝试更新到最新版本,以获得更好的稳定性和兼容性。

6. 检查操作系统兼容性:确保你的操作系统与Dev-C++兼容。Dev-C++可能不支持一些较新的操作系统或具有特定配置的系统。

如果以上步骤仍然无法解决问题,请提供更具体的错误信息、代码或环境设置的详细信息,这样可以帮助我们更准确地诊断和解决问题。

希望能对你有所帮助!如果还有其他问题,请随时提问。
此内容为ChatGPT回答,如果胡说八道,请不要理会
如果对你有帮助,请设置一个最佳答案!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 19:17:44 | 显示全部楼层
这段代码是一个使用结构体的示例,用于录入和显示一本书的信息。代码中定义了一个名为`Book`的结构体,包含书名、作者、售价、出版日期和出版社等属性。
  1. #include <stdio.h>
  2. #pragma pack(1) // 设置结构体按照1字节对齐
  3. struct Book {
  4.     char title[128];
  5.     char author[40];
  6.     float price;
  7.     unsigned int date;
  8.     char publisher[40];
  9. };
  10. #pragma pack() // 恢复默认的对齐方式
  11. int main() {
  12.     struct Book book;
  13.     printf("请输入书名:");
  14.     fgets(book.title, sizeof(book.title), stdin);
  15.     printf("请输入作者:");
  16.     fgets(book.author, sizeof(book.author), stdin);
  17.     printf("请输入售价:");
  18.     scanf("%f", &book.price);
  19.     printf("请输入出版日期:");
  20.     scanf("%u", &book.date);
  21.     getchar(); // 读取之前的换行符
  22.     printf("请输入出版社:");
  23.     fgets(book.publisher, sizeof(book.publisher), stdin);
  24.     printf("\n======== 数据录入完毕 ========\n");
  25.     printf("书名:%s", book.title);
  26.     printf("作者:%s", book.author);
  27.     printf("售价:%.2f\n", book.price);
  28.     printf("日期:%u\n", book.date);
  29.     printf("出版社:%s", book.publisher);
  30.     return 0;
  31. }
复制代码

这段代码首先定义了一个名为`Book`的结构体,并使用`#pragma pack(1)`设置该结构体按照1字节对齐。然后在主函数中,创建了一个`book`的结构体变量。

接下来,通过使用`fgets`函数分别读取书名和作者,并使用`scanf`函数读取售价和出版日期。注意,为了避免数据输入时读取到之前的换行符,使用了`getchar()`函数来读取并丢弃该换行符。

最后,使用`printf`函数输出录入的书籍信息。

请注意,代码中对于`scanf`和`fgets`函数的使用有所不同,这是因为`fgets`函数可以读取带有空格的字符串,而`scanf`函数在读取字符串时会遇到空格停止读取。另外,还需要注意使用`%u`格式化符号来读取无符号整数。

在运行代码之前,确保已经安装并正确配置了Dev-C++开发环境。希望对你有帮助!

此内容为ChatGPT回答,如果对你有帮助,请设置一个最佳答案!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 21:01:41 | 显示全部楼层
以上代码是一个使用Dev-C++编写的简单的图书信息录入程序。这个程序定义了一个结构体Book`,包含了书名、作者、售价、出版日期和出版社等信息。scanf和`fgets`函数从控制台输入各个字段的值,然后将这些值赋给`Book`结构体的相应成员变量。最后,程序打印出录入完成的图书信息。#pragma pack指令来设置结构体的字节对齐方式。默认情况下,结构体按照特定规则进行字节对齐,可以提高内存访问的效率。而使用`#pragma pack(1)`则表示将结构体的对齐方式设置为1字节对齐,这样可以减小结构体的内存占用。fgets`函数,能够避免由于输入过长导致的缓冲区溢出的问题。另外,对于读取出版日期前需要使用`getchar()`函数读取之前的换行符。

总之,以上代码是一个简单的图书信息录入程序,可以在Dev-C++上运行,并通过控制台与用户交互以录入图书信息。

此内容为ChatGPT回答,如果对你有帮助,请设置一个最佳答案!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-26 09:57:47 | 显示全部楼层
就是vscode终端的编码问题,把编码改了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-26 15:07:33 | 显示全部楼层
liuhongrun2022 发表于 2023-8-25 21:01
以上代码是一个使用Dev-C++编写的简单的图书信息录入程序。这个程序定义了一个结构体Book`,包含了书名、作 ...

C:\Users\yzsjy\Pictures\VS
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-26 15:08:27 | 显示全部楼层
liuhongrun2022 发表于 2023-8-25 19:17
这段代码是一个使用结构体的示例,用于录入和显示一本书的信息。代码中定义了一个名为`Book`的结构体,包含 ...

我复制粘贴代码到VS code 运行 打印中文还是乱码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-28 10:51:27 | 显示全部楼层
我直接用你的代码在VS Code上运行没有问题啊。  建议查看以下的VS Code右下角的字符编码

  1. PS D:\temp\Project> cd "d:\temp\Project" ; if ($?) { gcc io_test.c -o io_test } ; if ($?) { .\io_test } ; if ($?) { rm .\io_test.exe }
  2. 请输入书名:《C语言》
  3. 请输入作者:小甲鱼
  4. 请输入售价:9.9
  5. 请输入出版日期:2023
  6. 请输入出版社:清华大学出版社

  7. ======== 数据录入完毕 ========
  8. 书名:《C语言》
  9. 作者:小甲鱼
  10. 售价:9.90
  11. 日期:2023
  12. 出版社:清华大学出版社        
  13. PS D:\temp\Project>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-28 14:15:33 | 显示全部楼层
肯定是中文编码的问题,他默认为utf-8.
在主函数第一句写上,
  1. system("chcp 65001 & cls");
复制代码

试试行不行?
如果不行,就在窗口右下角找编码方式,改成ansi即可。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 08:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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