【问题标题】:How to make the loop stop in this code when blank line is input in c在c中输入空行时如何在此代码中停止循环
【发布时间】:2016-10-31 20:20:00
【问题描述】:

我需要这样做,以便当 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');
}

【问题讨论】:

  • 您在while 中的条件也是错误且无用的,因为您的if 已经处理了它。编译并打开警告并阅读它们。你甚至不必在这里发帖。
  • 另外,您不能使用fgets()ints 读入intTeacherSalary。或者至少尝试这样做会产生不太可能是您期望或想要的未定义行为。您可能想读入一个char 数组,然后用sscanf() 解析出int(如果有的话)。
  • if (charTeacherFirstName == '\n') 你不能用这种方式测试 C 中的字符串相等性。
  • 在看到fgets(intTeacherSalary, 50, stdin); 之后,我建议您需要一些时间来学习 C 教程序列。研究fgets 的工作原理,您的目标变量是int[] 数组。

标签: c arrays input fgets


【解决方案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;

【讨论】:

    【解决方案2】:

    您的代码存在多个问题:

    • 您没有测试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;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2017-03-18
      相关资源
      最近更新 更多