c - 'fgets' 在 'printf' 之后运行

标签 c

我正在慢慢学习 C。我在此处阅读了有关处理字符串的输入和输出的页面:http://www.cprogramming.com/tutorial/c/lesson9.html

在最后一个代码示例中,fgets 用于获取变量的输入并将其分配给 char 数组 name。我尝试在我自己的程序中实现类似的东西。

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

/* This is my very first C program! */

bool test=true;

/* Function Prototypes */

int mult(int x, int y);

/* Structures */

struct Person {
    int age;
    char name[256];
};

/* Complicated Array ;P */

struct Person *FirstPeriod[22];
char FakeString[100];

void PracticeStrings()
{
    int i;
    fgets(FirstPeriod[0]->name, 256, stdin);
    for (i=0;i<256;i++)
    {
            if (FirstPeriod[0]->name[i]=='\n')
                FirstPeriod[0]->name[i]='\0';
    }
    printf("\n\nHello Student 0: %s",FirstPeriod[0]->name);
}

int main()
{
    struct Person DadeLamkins;
    DadeLamkins.age=16;
    int numb;
    int x;
    int *numb_address=&numb;
    numb_address=malloc(sizeof(*numb_address));

    FirstPeriod[0]=&DadeLamkins;

    if (true)
        printf("-__- \n\n");

    printf("Please enter a number: ");
    scanf("%d", &numb);
    switch (numb) {
        case 0:
            printf("Dude, 0 is lame...\n");
            break;
        case 7:
            printf("Dude, 7 is my favorite number!\n");
            break;
        default:
            printf("You entered %d\n", numb);
            break;
    }
    for (x=0;x<numb+1;x++) {
        printf("\n::# %d",mult(x,2));
    }
    printf("\n\n%d",numb_address);
    free(numb_address);
    numb_address=0;
    PracticeStrings();
    getchar();
    return 0;
}

int mult (int x, int y)
{
    return x*y;
}

第 26 行的 PracticeStrings 函数是当前的问题。当我编译时,它会在接受输入(来自 fgets)之前显示 Hello Student 0: 。我正在使用 Code::Blocks 进行编译。

如有任何帮助,我们将不胜感激!

编辑...

哈哈哈,是的,我明白我的程序效率很低,很傻。如您所知,它并没有真正取得多大成就。这主要是为了插入我目前正在学习的东西,并尝试在不实际重写代码示例的情况下应用这些东西(如果我逐字复制,我能学到什么?)。无论如何,感谢您的帮助!我想这确实有道理!很遗憾我的教程没有提到这一点,我相信这只是需要一点更高的理解。我敢肯定,教程编写者没想到有人会像我那样混合功能。

非常感谢你们!希望我能习惯这一点。我已经用 .net 语言编写了大量脚本,希望我可以将 C 添加到此列表:)

最佳答案

这是因为当你读取数字时:

scanf("%d", &numb);

stdin 缓冲区中仍有 \n。因此,当您调用 PracticeStrings() 并随后:

fgets(FirstPeriod[0]->name, 256, stdin);

你阅读了 \n 并结束了

FirstPeriod[0]->name[i] == '\0';

此外,在你学习的过程中,学会验证:)

即:

if ((foo = malloc(blah)) == NULL) {
    ... err ...

更重要的是:

if (scanf(..) != number_of_items_i_want) {
    ... did not get a number, or what ever I wanted ...

等等

关于c - 'fgets' 在 'printf' 之后运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10081209/

相关文章:

c - 关于C中头文件位置的帮助

c - Linux:为什么 sig_atomic_t 类型定义为 int?

我可以为鼠标按钮设置全局 GTK 加速器吗?

c - fork 实现

c - 这两种说法有什么区别?

c - 欧拉计划挑战 3

c - fgetc 给我垃圾

c - C 中的函数没有返回正确的值

c - 意外的 getnameinfo() 主机名

c - STRLEN 错误 - 字符串类型