在 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 int
s.
由于某些在线编译器使用 stdin
输入的方式,它会停止,基本上是一次性读出。
示例:
它停止 here,有一次 stdin
读数。
它不会停止 here,有一个类似 input/output 的控制台。
因此,如果您想在给定数量的输入处停止,您可以执行以下操作:
//...
while (i < 5 && scanf(" %d", &array[i]) > 0)
{
i++;
}
//...
这将读取 5 int
s,退出循环并继续下一条语句。
如果你真的不知道输入的数量,你可以这样做:
//...
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;
}
我附上了下面的一段代码,它在在线编译器中工作得很好,但在使用 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 int
s.
由于某些在线编译器使用 stdin
输入的方式,它会停止,基本上是一次性读出。
示例:
它停止 here,有一次 stdin
读数。
它不会停止 here,有一个类似 input/output 的控制台。
因此,如果您想在给定数量的输入处停止,您可以执行以下操作:
//...
while (i < 5 && scanf(" %d", &array[i]) > 0)
{
i++;
}
//...
这将读取 5 int
s,退出循环并继续下一条语句。
如果你真的不知道输入的数量,你可以这样做:
//...
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;
}