首先,如果您只是学习 C,那么您可以学到的最有价值的课程之一就是始终验证用户输入。不需要太多操作,只需检查scanf 的返回,如果成功转换,则验证收到的值是否在您的允许范围内。例如,由于您的 rows 和 column 输入用于数组边界,它们必须大于 0,所以您可以这样做:
int rtn = 0;
printf ("Number of rows: ");
/* VALIDATE all user input */
if ((rtn = scanf ("%d", &r)) != 1 || r < 1) {
if (rtn == EOF) { /* respect cancellation of input with EOF */
putchar ('\n'); /* tidy up */
return 1;
}
fprintf (stderr, "error: invalid number of rows provided.\n");
/* handle error as desired */
}
现在如果你想再次显示你的提示,如果输入了一个无效的row值,你可以简单地将整个例程放入一个无限循环中,当输入有效输入时break,例如
for (;;) {
int rtn = 0;
printf ("Number of rows: ");
/* VALIDATE all user input */
if ((rtn = scanf ("%d", &r)) != 1 || r < 1) {
if (rtn == EOF) { /* respect cancellation of input with EOF */
putchar ('\n'); /* tidy up */
return 1;
}
fprintf (stderr, "error: invalid number of rows provided.\n");
}
else
break;
}
接下来,无需使用昂贵的modulo ('%') 测试,您真正关心的只是打印 odd row 和 col 值是您的 @ 987654333@ 值不是 奇数 值(因为数组索引在 C 中是从零开始的,所以第一、第三、第五等列都有一个 even 值),因此只需检查列的 LEAST SIGNIFICANT BIT,例如:
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++)
if (!(j & 0x1)) /* check if the first bit of the column is 0 */
printf ("%2d ", A[i][j]); /* print the number */
else
printf ("__ "); /* print an equivalent blank */
putchar ('\n'); /* never use printf for a single char */
}
如果您想要更短的代码,尽管可读性稍差,您可以使用ternary 运算符来控制测试和打印,例如
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++)
!(j & 0x1) ? printf ("%2d ", A[i][j]) : printf ("__ ");
putchar ('\n');
}
为了只打印奇数rows,只需检查row 的最低有效位 是否为奇数并完全跳过该行,例如
for (i = 0; i < r; i++) {
if (i & 0x1) { /* skip printing of even rows */
putchar ('\n');
continue;
}
...
总而言之,您可以执行以下操作:
#include <stdio.h>
int main (void) /* make clear no arguments are expected */
{
int r, c, i, j;
for (;;) {
int rtn = 0;
printf ("Number of rows: ");
/* VALIDATE all user input */
if ((rtn = scanf ("%d", &r)) != 1 || r < 1) {
if (rtn == EOF) { /* respect cancellation of input with EOF */
putchar ('\n'); /* tidy up */
return 1;
}
fprintf (stderr, "error: invalid number of rows provided.\n");
}
else
break;
}
for (;;) {
int rtn = 0;
printf ("Number of columns: ");
if ((rtn = scanf ("%d", &c)) != 1 || c < 1) {
if (rtn == EOF) {
putchar ('\n');
return 1;
}
fprintf (stderr, "error: invalid number of columns provided.\n");
}
else
break;
}
int A[r][c];
printf ("Enter your numbers\n");
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++)
if (scanf ("%d", &A[i][j]) != 1) {
fprintf (stderr, "error: invalid array input.\n");
return 1;
}
}
for (i = 0; i < r; i++) {
if (i & 0x1) { /* skip printing of even rows */
putchar ('\n');
continue;
}
for (j = 0; j < c; j++)
if (!(j & 0x1)) /* check if the first bit of the column is 0 */
printf ("%2d ", A[i][j]); /* print the number */
else
printf ("__ "); /* print an equivalent blank */
putchar ('\n'); /* never use printf for a single char */
}
}
使用/输出示例
$ ./bin/array_prnodd
Number of rows: 4
Number of columns: 4
Enter your numbers
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 __ 3 __
9 __ 11 __