鱼C论坛

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

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

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

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

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

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

VS.png
#include <stdio.h>

struct Book
{
    char title[128];
    char author[40];
    float price;
    unsigned int date;
    char publisher[40];
};

int main()
{
    struct Book book;

    printf("请输入书名:");
    scanf("%s", book.title);
    printf("请输入作者:");
    scanf("%s", book.author);
    printf("请输入售价:");
    scanf("%f", &book.price);
    printf("请输入出版日期:");
    scanf("%d", &book.date);
    printf("请输入出版社:");
    scanf("%s", book.publisher);

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

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

在MSVC编译器中,结构体的对齐规则可能与MinGW编译器略有不同,从而导致在输出结构体变量时出现问题。为了解决这个问题,你可以尝试在结构体定义中显式地指定对齐方式。
#pragma pack(1)  // 设置结构体按照1字节对齐
struct Book {
   char title[128];
   char author[40];
   float price;
   unsigned int date;
   char publisher[40];
};
#pragma pack()  // 恢复默认的对齐方式

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

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

希望这对解决你的问题有帮助!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

下面是修改后的代码:
#include <stdio.h>

struct Book
{
    char title[128];
    char author[40];
    float price;
    unsigned int date;
    char publisher[40];
};

int main()
{
    struct Book book;

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

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

    return 0;
}

这样就可以正确读取包含空格的字符串,并输出结构体变量的值了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 16:00:29 | 显示全部楼层
16-25行,scanf少了&
    printf("请输入书名:");
    scanf("%s", &book.title);
    printf("请输入作者:");
    scanf("%s", &book.author);
    printf("请输入售价:");
    scanf("%f", &book.price);
    printf("请输入出版日期:");
    scanf("%d", &book.date);
    printf("请输入出版社:");
    scanf("%s", &book.publisher);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

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

我试了一下 但打出来的还是问号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

少了&
比如:
scanf("%s", book.title);

改为:
scanf("%s", &book.title);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

输出的格式还是 问号

C:\Users\yzsjy\Pictures\VS\2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

定义的是个字符数组么  可以不用添加&  
按照您的方法试了一下 输出的还是乱码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

> gcc Test1.c -o Test1
> ./Test1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

请注意,根据您提供的代码,存在一些重复和错误的部分。下面是修正后的代码:
#include <stdio.h>#pragma pack(1) // 设置结构体按照1字节对齐struct Book {    char title[128];    char author[40];    float price;    unsigned int date;    char publisher[40];};#pragma pack() // 恢复默认的对齐方式int main() {    struct Book book;    printf("请输入书名:");    fgets(book.title, sizeof(book.title), stdin);    printf("请输入作者:");    fgets(book.author, sizeof(book.author), stdin);    printf("请输入售价:");    scanf("%f", &book.price);    printf("请输入出版日期:");    scanf("%u", &book.date);    getchar(); // 读取之前的换行符    printf("请输入出版社:");    fgets(book.publisher, sizeof(book.publisher), stdin);    printf("\n======== 数据录入完毕 ========\n");    printf("书名:%s", book.title);    printf("作者:%s", book.author);    printf("售价:%.2f\n", book.price);    printf("日期:%u\n", book.date);    printf("出版社:%s", book.publisher);    return 0;}
以上代码修正了重复定义结构体的问题,并使用了`fgets()`函数来读取带有空格的输入,以及正确地读取无符号整数。同时,代码中添加了适当的换行符来格式化输出。

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

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

此内容为ChatGPT回答,如果对你有帮助,请设置一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> 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回答,如果胡说八道,请不要理会
如果对你有帮助,请设置一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 19:17:44 | 显示全部楼层
这段代码是一个使用结构体的示例,用于录入和显示一本书的信息。代码中定义了一个名为`Book`的结构体,包含书名、作者、售价、出版日期和出版社等属性。
#include <stdio.h>#pragma pack(1) // 设置结构体按照1字节对齐struct Book {    char title[128];    char author[40];    float price;    unsigned int date;    char publisher[40];};#pragma pack() // 恢复默认的对齐方式int main() {    struct Book book;    printf("请输入书名:");    fgets(book.title, sizeof(book.title), stdin);    printf("请输入作者:");    fgets(book.author, sizeof(book.author), stdin);    printf("请输入售价:");    scanf("%f", &book.price);    printf("请输入出版日期:");    scanf("%u", &book.date);    getchar(); // 读取之前的换行符    printf("请输入出版社:");    fgets(book.publisher, sizeof(book.publisher), stdin);    printf("\n======== 数据录入完毕 ========\n");    printf("书名:%s", book.title);    printf("作者:%s", book.author);    printf("售价:%.2f\n", book.price);    printf("日期:%u\n", book.date);    printf("出版社:%s", book.publisher);    return 0;}
这段代码首先定义了一个名为`Book`的结构体,并使用`#pragma pack(1)`设置该结构体按照1字节对齐。然后在主函数中,创建了一个`book`的结构体变量。

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

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

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

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

此内容为ChatGPT回答,如果对你有帮助,请设置一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> 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回答,如果对你有帮助,请设置一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-26 09:57:47 | 显示全部楼层
就是vscode终端的编码问题,把编码改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

C:\Users\yzsjy\Pictures\VS
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我复制粘贴代码到VS code 运行 打印中文还是乱码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-28 10:51:27 | 显示全部楼层
我直接用你的代码在VS Code上运行没有问题啊。  建议查看以下的VS Code右下角的字符编码
PS D:\temp\Project> cd "d:\temp\Project" ; if ($?) { gcc io_test.c -o io_test } ; if ($?) { .\io_test } ; if ($?) { rm .\io_test.exe }
请输入书名:《C语言》
请输入作者:小甲鱼
请输入售价:9.9
请输入出版日期:2023
请输入出版社:清华大学出版社

======== 数据录入完毕 ========
书名:《C语言》
作者:小甲鱼
售价:9.90
日期:2023
出版社:清华大学出版社        
PS D:\temp\Project> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-28 14:15:33 | 显示全部楼层
肯定是中文编码的问题,他默认为utf-8.
在主函数第一句写上,
system("chcp 65001 & cls");
试试行不行?
如果不行,就在窗口右下角找编码方式,改成ansi即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 09:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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