当在c中输入空行时,如何使循环在此代码中停止

时间:2016-10-31 20:20:00

标签: c arrays input fgets

我需要这样做,以便当charTeacherFirstName输入任何内容(按下回车键)时,此循环停止输入。我有这个,但问题是,如果按下回车键,循环只是继续询问东西,就好像它没有读取空白。

int main(void)
{
    int intTeacherSalary[50];
    char charTeacherFirstName[50][50];
    char charTeacherLastName[50][50];

    do
   {
        printf("Enter the teacher's first name: ");
        fgets(charTeacherFirstName, 50, stdin);

        if (charTeacherFirstName == '\n')
        {
            break;
        }
        else
        {
            printf("Enter the teacher's last name: ");
            fgets(charTeacherLastName, 50, stdin);

            printf("Enter teacher's salary: ");
            fgets(intTeacherSalary, 50, stdin);
        }

  } while (charTeacherFirstName != '\n');
}

2 个答案:

答案 0 :(得分:1)

起初你的代码错了。 charTeacher...Name是一个2dim数组,你不能像这样使用它。然后...Salaryint,但您使用fgets进行了阅读,但不兼容。

此外,您无法比较stringchar,这些情况有很大不同。

所以名字就是名字。单个字符。 'a', 'b', '!', '5'是字符。当您对它们进行立即引用时,您需要将它们放在单引号'...'之间。

字符串让我们说一系列字符("abc", "food", "what a nice weather"。你可以认为它们是数组,就像你声明它们一样。它们也可以被声明为字符上的指针然后你需要使用malloc(N * sizeof(char))(或类似的东西)来获取操作所需的内存。当你想要在字符串上立即引用时,你必须将它放在双引号("...")之间。字符串必须以NULL个字符(即'\0')。

我想说在每种情况下,您对intint []int *的说法都是一样的。

为了比较字符串,您需要使用strcmp。使用man strcmp查看其使用方式和返回方式,以及#include所需的库。

您的情况应为if (strcmp(charTeacherFirstName, "\n") == 0) break;

答案 1 :(得分:0)

您的代码中存在多个问题:

  • 您不测试fgets()的返回值。它将在文件末尾返回NULL,然后您不应继续提示输入更多内容。

  • 您应该将字符串读入每个数组的下一个数组元素。

  • 您不需要do / while循环,您已经正确测试了最终用例,使用for循环并在数组已满时停止。

  • 您读取数组中的行但不删除尾随换行符。

以下是更正后的版本:

#include <stdio.h>

void trim_linefeed(char *buf) {
    int len = strlen(buf);
    if (len > 0 && buf[len - 1] == '\n')
        buf[len - 1] = '\0';
}

int main(void) {
    char buf[80];
    int intTeacherSalary[50];
    char charTeacherFirstName[50][50];
    char charTeacherLastName[50][50];
    int i, n;

    for (n = 0; n < 50; n++) {
        printf("Enter the teacher's first name: ");
        if (!fgets(charTeacherFirstName[n], 50, stdin))
            break;

        if (charTeacherFirstName[n][0] == '\n')
            break;
        trim_linefeed(charTeacherFirstName[n]);

        printf("Enter the teacher's last name: ");
        if (!fgets(charTeacherLastName[n], 50, stdin))
            break;
        trim_linefeed(charTeacherLastName[n]);

        printf("Enter teacher's salary: ");
        if (!fgets(buf, sizeof buf, stdin))
            break;
        if (sscanf(buf, "%d", &intTeacherSalary[n]) != 1) {
            intTeacherSalary[n] = 0;
        }
    }
    printf("%d teachers:\n", n);
    for (i = 0; i < n; i++) {
        printf("%s %s: %d\n",
               charTeacherFirstName[i],
               charTeacherLastName[i],
               intTeacherSalary[i]);
    }
    return 0;
}