【问题标题】:C - exit for loop by pressing enter keyC - 按回车键退出循环
【发布时间】:2016-12-12 21:40:55
【问题描述】:

我正在尝试从数组中打印一串字符,并在按下“Enter”键时结束循环。

int i;
char charArry[MAXARY];

printf("Input an array of chars: \n\n");

for (i = 0; i < MAXARY && charArry[i] != 13; i++)
{
    scanf(" %c", &charArry[i]);
}

for (i = 0; i < MAXARY; i++)
{
    printf(" %c", charArry[i]);
}

由于某种原因,每当我按 Enter 键时,它都会转到新行而不是中断循环。有什么建议吗?

附言 MAXARY 是数组长度的常数,目前为 20。

【问题讨论】:

  • 请勿使用scanf 进行用户输入。
  • 你只是在读取charArry的未初始化值
  • charArry[i] 永远不会是 13 ('\r') 给定" %c"。可以使用"%c",但这会导致其他问题。通常“enter”被翻译成'\n',但同样的问题。
  • 仍然会因为 OP 尝试对这个进行 UV 测试以进行重要的代码测试:防止 i &lt; MAXARY 溢出。
  • @melpomene - 这是一个朋友的学校作业,他必须使用 scanf

标签: c loops scanf


【解决方案1】:

您即将完成这项工作。虽然我同意应避免使用 scanf,但请参阅:Why does everyone say not to use scanf? What should I use instead?,您的程序未按预期执行的原因是由于逻辑错误。

你的 for 循环状态:

for (i = 0; i < MAXARY && charArry[i] != 13; i++)

现在回顾一下 for 循环的工作原理,您有:

1. initalization (i=0)
2. conditional check (i < MAXARY && charArry[i] != 13)
3.        conditional block (scanf)
4. increment (i++)
5. return to 2

您会注意到您的charArray[i] != 13check 是在i 递增之后发生的。因此,您不会检查刚刚读取的字符,而是检查 charArray[i] 中的下一个字符。这就是为什么您永远不会在 \r 字符处打破循环的原因。

建议的修复方法是:

for (i = 0; i < MAXARY; i++)
{
    int result = scanf("%c", &charArry[i]);
    if( result != 1 || charArry[i] == '\n' )
       break;
}

i 是读取的字符时,它会检查 scanf 是否成功和 charArry。

还要注意chux 指出\r 字符是回车符,而不是换行符。因此,此检查仅在您在 Windows 上工作时才有效(因为 unix 不使用 \r)。如果您想独立于平台,请使用\n

【讨论】:

  • 糟糕,是的,同意,意味着要删除它。
  • 请注意,在文本模式下,Windows 会过滤掉 \r,其中文本文件的行尾为 \r\n
【解决方案2】:

由于某种原因,每当我按 Enter 键时,它都会转到新行而不是中断循环。

scanf(" %c", &amp;charArry[i]); 格式的空格指示scanf() 消耗和丢弃所有可选的前导空格。 charArry[i] 永远不会被分配 13,因为 13 通常是 '\r',一个空格。


回车键通常被翻译成'\n'

不要测试没有分配@Red Alert的值

//                        v---------v not assigned yet.       
for (i = 0; i < MAXARY && charArry[i] != 13

修复代码

int i;
char charArry[MAXARY];

printf("Input an array of chars: \n\n");

for (i = 0; i < MAXARY; i++) {
  if (scanf("%c", &charArry[i]) != 1) break;  // End of file or error occurred
  // If enter key encountered
  // Usualy the charArry[i] == '\r' is not needed.
  if (charArry[i] == '\n' ||  charArry[i] == '\r') break;
}

// Only print out characters that were read.
int j;
for (j = 0; j < i; j++) {
    printf("%c", charArry[j]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2020-09-21
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多