c - 用 C 编写的代码不适用于 Visual Studio

标签 c visual-studio

我正在尝试在 Visual stuido 中运行以下代码。请执行此代码,然后在此处键入的代码下方阅读我的经验。

#include <stdio.h>
#include <conio.h>
main()
{
int i;
struct book
{
    char name;
    float price;
    int pages;
};
struct book b[3];
printf("Enter the names prices & no. of pages of 3 books \n");
for (i = 0; i<=2; i++)
{
    printf("name of book %d : ", i +1);
    scanf("%c", &b[i].name);
    printf("price of book %d : ", i +1);
    scanf("%f", &b[i].price);
    printf("pages in book %d : ", i +1);
    scanf("%d", &b[i].pages);
}
for (i = 0; i<=2; i++)
{
    printf("Name of book : %c, Price of book: %f, Pages in book : %d \n", b[i].name, b[i].price, b[i].pages);
}
printf("Press any key to continue");
getch();
 }
void linkfloat()
{
    float a =0, *b;
    b = &a;
    a = *b;
}

如您所见,它会询问用户书名、页码和价格,但碰巧当您在 Visual Basic 中运行代码时,它不允许为 B2 以后的书键入名称,但它允许用户键入价格和同一本书 b[i] 的页码,向前移动它会在不允许用户键入名称的地方为书名打印一个空格。

最佳答案

这是您不应该依赖 scanf() 进行输入的原因之一,因为错误的输入可能会搞砸一切。我不确定您之前使用的是什么编译器,但此代码不应在任何符合标准的 c 编译器中运行。

读取或打印字符串时,必须使用格式标记%s%c 仅代表单个字符,因此输入任何长于一个字符的名称都会搞砸所有随后的输入请求(除非处理得当,例如通过刷新 stdin)。

以类似的方式,您的 name 成员可能只存储一个字符 - 而不是完整的名称。将其更改为数组,例如字符名称[64]。确保它的长度足以存储完整的名称(并避免缓冲区溢出)。

可能还有其他错误,但我认为这些是阻止您发现任何其他问题(如果有的话)的最重要错误。

编辑: 尝试了代码,问题是由于换行符(从点击返回)仍然位于 stdin 中。当读取一个整数或 float 时,它被跳过(由于没有形成有效输入),但它被 %c 接受(没有检查它,但如果你这样做,你应该注意到读取的值应等于 \n)。

要解决此问题,请始终在使用 scanf() 阅读后调用 fflush(stdin);。在读取字符之前做这件事应该就足够了,但它仍然有点容易出错。

关于c - 用 C 编写的代码不适用于 Visual Studio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10277550/

相关文章:

c++ - 对 getaddrinfo() 的所有调用均返回 11001

visual-studio - Visual Studio 中 Rebuild 和 Clean + Build 的区别

c++ - 从配置为生成 DLL 的 visual studio 项目创建 lib 文件

visual-studio - Visual Studio 解决方案文件夹作为真实文件夹

c++ - 使用正则表达式查找和替换

c - 在 C 中,a+++b 是否等于 a+b++?

c - LVCOLUMN.cchTextMax 和 LVITEM.cchTextMax 的用途是什么?

c - C for Windows 32 控制台应用程序中的计时器事件

c - realloc() 不会返回带有旧值副本的新 block

visual-studio - 无法找到许可证组件