在C编程中,当达到EOF时如何退出stdin
我的程序有问题。它的目的是从用户那里读取输入的数字,当用户停止输入数字时(ctrl-d),它会收集输入的数字并打印出“奇数:等等” “偶数是:废话” 我在如何在EOF退出程序方面遇到了问题,当我感觉我已经克服了这个问题时,另一个问题出现了,那就是我的程序没有从数组中打印数字。它只打印“奇数为:”和“偶数为:” 感谢您的帮助。 谢谢在C编程中,当达到EOF时如何退出stdin,c,arrays,stdin,eof,getchar,C,Arrays,Stdin,Eof,Getchar,我的程序有问题。它的目的是从用户那里读取输入的数字,当用户停止输入数字时(ctrl-d),它会收集输入的数字并打印出“奇数:等等” “偶数是:废话” 我在如何在EOF退出程序方面遇到了问题,当我感觉我已经克服了这个问题时,另一个问题出现了,那就是我的程序没有从数组中打印数字。它只打印“奇数为:”和“偶数为:” 感谢您的帮助。 谢谢 #包括 #包括 #包括 内部主(空){ int n,i,数组[1000]; i=0; while(i=getchar()!=EOF){ scanf(“%d”和数组[i
#包括
#包括
#包括
内部主(空){
int n,i,数组[1000];
i=0;
while(i=getchar()!=EOF){
scanf(“%d”和数组[i]);
i++;
}
printf(“奇数为:”);
i=0;
而(i=getchar()!=EOF){
if(数组[i]%2!=0){
printf(“%d”,数组[i]);
i++;
}
}
printf(“\n编号为:”);
i=0;
而(i=getchar()!=EOF){
if(数组[i]%2==0){
printf(“%d”,数组[i]);
i++;
}
}
printf(“\n”);
返回0;
}
将输入循环更改为:
n = 0;
while ( 1 == scanf("%d", &array[n]) )
++n;
实际上,您要做的是一直读取数字,直到读取尝试失败;此循环条件表示该逻辑。忘掉EOF吧。(最好在n
达到1000
时添加停止逻辑,以避免缓冲区溢出)
在输出循环中,您不想进行任何输入,因此调用
getchar()
不是一个好主意。相反,使用一个“正常”循环,用于(i=0;i
执行到int的单位数转换
你可能会让事情变得比需要的更艰难。虽然您可以使用While(scanf(“%d”)和&array[i])==1)
读取以空格分隔的整数并避免执行手动转换,但如果您的目的是读取单个数字,那么使用getchar()
就可以了。(就此而言,您可以使用getchar()
读取任何多位数整数,您只需提供从ASCII字符到最终数值的转换)
单位数字符的手动转换是直接的吗?当您以字符形式读取数字时,您不是在读取由数字表示的整数值,而是在读取代表每个数字的字符的ASCII值。看见要将单个ASCII字符数字转换为其整数值,必须减去'0'
的ASCII值。(注意:单引号很重要)
例如,如果您使用int c=getchar()读取一个数字
,则需要减去'0'
以获得一位数整数值,例如int n=c-'0'代码>
填充数组时,必须始终防止写入超出数组边界的内容。如果您声明int数组[1000]={0}
(它有可用的从零开始的数组索引0-999
),然后必须验证您从未写入超出索引999
或未定义的行为结果。为了保护数组边界,只需跟踪已填充索引的数量,并测试它始终低于可用数组元素的数量,例如
while (n < MAX && (c = getchar()) != EOF) /* always protect array bounds */
if ('0' <= c && c <= '9') /* only handle digits */
array[n++] = c - '0'; /* convert ASCII to int */
当然,对于偶数,位将是0
(例如二进制中的8
是1000
),因此相应的测试可以是:
if ((array[i] & 1) == 0) /* if ones-bit is 0, even */
printf (" %d", array[i]);
将所有片段放在一起,您可以存储在数组中读取的所有单个数字
,然后以非常简单的方式分离奇偶数以便打印(注意:不需要stdlib.h
或math.h
)
示例使用/输出
$ echo "01234567890123456789" | ./bin/arrayevenodd
array : 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
array - odd : 1 3 5 7 9 1 3 5 7 9
array - even : 0 2 4 6 8 0 2 4 6 8
$ echo "1,2,3,5,76,435" | ./bin/arrayevenodd2
array : 1 2 3 5 76 435
array - odd : 1 3 5 435
array - even : 2 76
仔细检查一下,如果你还有其他问题,请告诉我
执行手动多位数转换到int
如果需要从字符转换多位数整数,最简单的方法是使用一个为您提供转换的函数(例如,scanf
函数系列,或使用面向行的fgets
或getline
并使用strtok
解析和转换数字字符串,然后使用strtol
,或使用sscanf
解析等。)
但是,手动将getchar()
读取的单个字符转换为多位数整数是很简单的。您只需检查一个有效字符,而不是整数的开头(包括+/-
的前缀)并对每个数字求和,通过在加法之前将总和乘以10
,为该数字的位置提供适当的偏移量(或者,如果为了提高编码效率而将总和设为负和,则实际减去)每个数字直到到达下一个非数字,然后将最终和添加到数组中,并推进数组索引
在构建总和时,在将最终总和添加到数组之前,您需要检查整数溢出。(您可以随意处理溢出情况,下面的示例仅抛出错误并退出)
手动转换可能会增加大约20行代码,例如
#include <stdio.h>
#include <stdint.h> /* exact length types */
#include <limits.h> /* INT_X constants */
#define MAX 1000 /* define constant rather than use 'magic' number in code */
int main (void)
{
int array[MAX] = {0},
c, i, start = 0, sign = 1, n = 0;
int64_t sum = 0;
while (n < MAX && (c = getchar()) != EOF) { /* always protect array bounds */
if (!start) { /* flag to start building int */
start = 1; /* flag - working on int */
if (c == '+') /* handle leading '+' sign */
continue;
else if (c == '-') /* handle leading '-' sign */
sign = -1;
else if ('0' <= c && c <= '9') /* handle digits */
sum = sum * 10 - (c - '0'); /* note: sum always computed */
else /* as negative value */
start = 0; /* reset - char not handled */
}
else if ('0' <= c && c <= '9') { /* handle digits */
sum = sum * 10 - (c - '0'); /* convert ASCII to int */
if (sum < INT_MIN || (sign != -1 && -sum > INT_MAX))
goto err; /* check for overflow, handle error */
}
else { /* non-digit ends conversion */
if (sum) /* if sum has value, add to array */
array[n++] = sign != -1 ? -sum : sum;
sign = 1; /* reset values for next conversion */
start = 0;
sum = 0;
}
}
if (sum) /* add last element to array on EOF */
array[n++] = sign != -1 ? -sum : sum;
printf ("\narray : "); /* output array contents */
for (i = 0; i < n; i++)
printf (" %d", array[i]);
printf ("\narray - odd : ");
for (i = 0; i < n; i++)
if (array[i] & 1) /* if ones-bit is 1, odd */
printf (" %d", array[i]);
printf ("\narray - even : ");
for (i = 0; i < n; i++)
if ((array[i] & 1) == 0) /* if ones-bit is 0, even */
printf (" %d", array[i]);
putchar ('\n'); /* tidy up w/newline */
return 0;
err:
fprintf (stderr, "error: overflow detected - array[%d]\n", n);
return 1;
}
带有“+/-”前缀的示例
$ echo "1,2,-3,+5,-76,435" | ./bin/arrayevenodd2
array : 1 2 -3 5 -76 435
array - odd : 1 -3 5 435
array - even : 2 -76
查看新示例,如果您还有任何问题,请告诉我。i=0;while(i=getchar()!=EOF){if(数组[i]%2!=0){printf(“%d”,数组[i]);i++;}}
for(n=i,i=0;i
检查这个:while(i=getchar()!=EOF){scanf(“%d”)和数组[i]);i++;}
-->
while(scanf(“%d”)和数组[i])==1{i++;}i=getchar()!=EOF
类似于i
$ echo "01234567890123456789" | ./bin/arrayevenodd
array : 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
array - odd : 1 3 5 7 9 1 3 5 7 9
array - even : 0 2 4 6 8 0 2 4 6 8
#include <stdio.h>
#include <stdint.h> /* exact length types */
#include <limits.h> /* INT_X constants */
#define MAX 1000 /* define constant rather than use 'magic' number in code */
int main (void)
{
int array[MAX] = {0},
c, i, start = 0, sign = 1, n = 0;
int64_t sum = 0;
while (n < MAX && (c = getchar()) != EOF) { /* always protect array bounds */
if (!start) { /* flag to start building int */
start = 1; /* flag - working on int */
if (c == '+') /* handle leading '+' sign */
continue;
else if (c == '-') /* handle leading '-' sign */
sign = -1;
else if ('0' <= c && c <= '9') /* handle digits */
sum = sum * 10 - (c - '0'); /* note: sum always computed */
else /* as negative value */
start = 0; /* reset - char not handled */
}
else if ('0' <= c && c <= '9') { /* handle digits */
sum = sum * 10 - (c - '0'); /* convert ASCII to int */
if (sum < INT_MIN || (sign != -1 && -sum > INT_MAX))
goto err; /* check for overflow, handle error */
}
else { /* non-digit ends conversion */
if (sum) /* if sum has value, add to array */
array[n++] = sign != -1 ? -sum : sum;
sign = 1; /* reset values for next conversion */
start = 0;
sum = 0;
}
}
if (sum) /* add last element to array on EOF */
array[n++] = sign != -1 ? -sum : sum;
printf ("\narray : "); /* output array contents */
for (i = 0; i < n; i++)
printf (" %d", array[i]);
printf ("\narray - odd : ");
for (i = 0; i < n; i++)
if (array[i] & 1) /* if ones-bit is 1, odd */
printf (" %d", array[i]);
printf ("\narray - even : ");
for (i = 0; i < n; i++)
if ((array[i] & 1) == 0) /* if ones-bit is 0, even */
printf (" %d", array[i]);
putchar ('\n'); /* tidy up w/newline */
return 0;
err:
fprintf (stderr, "error: overflow detected - array[%d]\n", n);
return 1;
}
$ echo "1,2,3,5,76,435" | ./bin/arrayevenodd2
array : 1 2 3 5 76 435
array - odd : 1 3 5 435
array - even : 2 76
$ echo "1,2,-3,+5,-76,435" | ./bin/arrayevenodd2
array : 1 2 -3 5 -76 435
array - odd : 1 -3 5 435
array - even : 2 -76