【问题标题】:Basic c program doesn't continue after the final scanf in the function, scanf just keeps accepting input endlessly在函数中的最终 scanf 之后,基本的 c 程序不会继续,scanf 只是不断地接受输入
【发布时间】:2016-01-30 03:45:18
【问题描述】:

相关代码如下:

我对 c 的世界有些陌生,所以请帮帮我 问题出在代码底部:divider = getchar() 这段代码让程序卡住了,之后就再也没有进展了。它只是一个允许输入的无限循环。怎么了。请具体一点,因为我对复杂的概念并不完全熟悉(尽管无论解决方案多么复杂,我都渴望解决这个问题)

void read_in(int n, int m)
{

    int a = 0, b = 0, i = 0, x;

    while (a != n && b != m)
    {
        if (b == 0 && i == 0)
        {
            printf("\nEnter row %d:  ", a);

         }

         scanf("%d", &array[a][b]);

         diglength[a][b] = floor (log10 (abs (array[a][b]))) + 1;

         if (b == m - 1)
         {
             a++;            
             b = -1;
         }
         if (b == -1 && i != 0 && a != n)
         {
             printf("\nEnter row %d:  ", a);
         }

         i++;
         b++;
    }

    printf("\nEnter the number of new lines in between rows: ");
    scanf("%d", &newlines);
    printf("\nEnter the span of each array element: ");

    scanf("%d", &span);

    check_span(n, m);
    getchar();
    printf("\nEnter the type of justification (l - left   r - right): ");

    just = getchar();

    while (just != 'r' && just != 'l')
    {
        printf("\nInvalid argument");
        printf("\nEnter the type of justification (l - left   r - right): ");
        scanf(" %c", &just);
    }

    printf("\nEnter the character to be placed in between elements: ");
    getchar();
    divider = getchar();
//THE PROGRAM NEVER GETS PAST HERE IT GETS STUCK ON THE ABOVE CHARACTER ASSIGNMENT...WHY

    printf("it got here "); printf("%c", divider);    
}

【问题讨论】:

  • 您可以删除很多空行以使您的代码更具可读性。
  • 只是猜测,最后一个 scanf 中有一个空格...我建议缩小范围,制作一个具有相同问题的更简单示例并继续剥离代码。这样一来,SO 上的人就会更有帮助。
  • 代码格式化的工作方式:首先需要一个空行,然后每行代码必须以 4 个空格字符开头。缩进时应使用额外的空格字符。
  • 是的,我已经尝试过了。很抱歉,乱码很着急,我试着修复一下。
  • @Chad 如果您键入一些字符,然后按Enter,它是否仍然被阻止?

标签: c


【解决方案1】:

我使用 Xcode 对此进行了测试,因为您没有提供所有代码,所以我不得不跳过很多代码并测试以下内容:

#include <stdio.h>

void read_in(int n, int m)
{ 
    char just = getchar();
    char divider;

    while (just != 'r' && just != 'l')
    {
        printf("\nInvalid argument");
        printf("\nEnter the type of justification (l - left   r - right): ");
        scanf(" %c", &just);
    }

    printf("\nEnter the character to be placed in between elements: ");
    getchar();
    divider = getchar();


    printf("it got here "); printf("%c", divider);    
}

int main(int argc, const char * argv[]) {

    read_in(8, 9);
    return 0;
}

得到以下输出:

Invalid argument
Enter the type of justification (l - left   r - right): l

Enter the character to be placed in between elements: k
it got here k

我怀疑您发布的此函数或代码段之外可能有问题。

在其他新闻中 - 我发现 scanf() 可能会令人困惑。我选择保留我的格式如下:scanf("%c", &amp;foo) 然后使用purge(stdin) 从“新鲜”开始输入缓冲区。

printf("Enter the character to be placed in between elements: ");

fpurge(stdin);
scanf("%c", &divider);

printf("it got here ");
printf("%c", divider);

使用上面的代码,我仍然设法到达最后一行,而且我个人认为scanf() 的错误空间较小。

希望能帮助您解决问题。

【讨论】:

    【解决方案2】:

    您是否在某处初始化了变量除法器? 尝试将最后两行替换为:

    char divider;
    divider = getchar();
    

    希望这会有所帮助!

    【讨论】:

    • 是的,我做到了。它没有什么过于明显的那样。调试了一段时间。我只是难住了。想不出有什么不对。
    • 并且分隔符是全局的
    • 您可能只是尝试用 scanf 替换所有 getchar(),它应该可以工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多