在 C 中使用 while(scanf) 时出现代码块错误

Code Blocks error when using while(scanf) in C

我附上了下面的一段代码,它在在线编译器中工作得很好,但在使用 C 时无法在代码块编译器中工作。我也附上了屏幕截图。

#include <stdio.h>

int main() {
    int i = 0;
    int array[100];
    while(scanf("%d",&array[i])>0)
    {
        i++;
    }
    for(int j=0;j<i;j++)
    {
        printf("%d ",array[j]);
    }
    return 0;
}

Using Online compiler(GeeksForGeeks)

Using CODEBLOCKS compiler

没有错误,您的 while 循环将继续,直到输入无效输入为止,您对输入的数量没有限制,因此它会继续取值,这以后可能会成为问题,因为你的容器只有 space 100 ints.

由于某些在线编译器使用 stdin 输入的方式,它会停止,基本上是一次性读出。

示例:

它停止 here,有一次 stdin 读数。

它不会停止 here,有一个类似 input/output 的控制台。

因此,如果您想在给定数量的输入处停止,您可以执行以下操作:

//...
while (i < 5 && scanf(" %d", &array[i]) > 0)
{
    i++;
}
//...

这将读取 5 ints,退出循环并继续下一条语句。

如果你真的不知道输入的数量,你可以这样做:

//...
while (i < 100 && scanf("%d", &array[i]) > 0) { // still need to limit the input to the
                                                // size of the container, in this case 100
    i++;
    if (getchar() == '\n') { // if the character is a newline break te cycle  
                             // note that there cannot be spaces after the last number
        break;
    }
}
//...

以前的版本缺少一些错误检查,因此要获得更全面的方法,您可以这样做:

#include <stdio.h>
#include <string.h> // strcspn
#include <stdlib.h> // strtol
#include <errno.h>  // errno
#include <limits.h> // INT_MAX

int main() {

    char buf[1200]; // to hold the max number of ints
    int array[100];
    char *ptr; // to iterate through the string
    char *endptr; // for strtol, points to the next char after parsed value
    long temp; //to hold temporarily the parsed value
    int i = 0;

    if (!fgets(buf, sizeof(buf), stdin)) { //check input errors

        fprintf(stderr, "Input error");
    }

    ptr = buf; // assing pointer to the beginning of the char array

    while (i < 100 && (temp = strtol(ptr, &endptr, 10)) && temp <= INT_MAX 
    && errno != ERANGE && (*endptr == ' ' || *endptr == '\n')) {

        array[i++] = temp; //if value passes checks add to array
        ptr += strcspn(ptr, " ") + 1; // jump to next number
    }

    for (int j = 0; j < i; j++) { //print the array

        printf("%d ", array[j]);
    }
    return EXIT_SUCCESS;
}