0

如果用户在二维数组中输入字母而不是数字,我将无法输出无效语句。

我尝试使用该isalpha函数来检查输入是数字还是字母,但它给了我一个分段错误。不知道有什么问题有任何提示?

以下代码只是分配矩阵元素的部分。

#include <stdio.h> 
#include <stdlib.h>
#include <ctype.h>

#define MAX 10

void display(int matrix[][MAX], int size);

int main() {
    int n, degree;
    int matrix[MAX][MAX];

    printf("Enter the size of the matrix: ");  // assigning size of the matrix
    scanf("%d", &n);

    if (n <= 1 || n >= 11) {  // can't be bigger than a 10x10 matrix
        printf("Invalid input.");
        return 0;
    }

    for (int i = 0; i < n; ++i) {  // assigning the elements of matrix
        printf("Enter the row %d of the matrix: ", i);
        for (int j = 0; j < n; ++j) {
           scanf("%d", &matrix[i][j]);

           if (!isalpha(matrix[i][j])) { // portion I'm having trouble with
               continue;
           } else {
               printf("Invalid input.");
               return 0;
           }
        }
    }
    ...
4

5 回答 5

2

由于 n 的值将是数字,我们可以使用 string 而不是 int 来解决它。

char num[10];
int n;
scanf("%s", num);
if(num[0] < '0' || num[0] > '9' || strlen(num) > 2){
    printf("invalid\n");
}
if(strlen(num) == 1) n = num[0] - '0';
if(strlen(num) == 2 && num[0] != 1 && num[1] != 0) printf("invalid\n");
else n = 10;

我们也可以使用 strtol() 函数将输入字符串转换为数字,然后检查有效性。您可以检查以下代码。我跳过了字符串输入部分。此外,您必须#include<stdlib.h>在开始时添加 strtol() 函数才能工作。

char *check;
long val = strtol (num, &check, 10);    
if ((next == num) || (*check != '\0')) {
        printf ("invalid\n");
}
if(val > 10 || val < 0) printf("invalid\n");
n = (int)val; //typecasting as strtol return long
于 2017-07-23T08:41:20.390 回答
1

c中stdlib的isdigit()库函数可以用来检查条件是否可以检查。

于 2017-07-25T09:22:27.570 回答
1

您必须检查 : 的返回值,scanf()它会告诉您输入是否根据格式字符串正确转换。scanf()返回成功转换的次数,这应该是1您的情况。如果用户键入一个字母,scanf()将返回0并且目标值将保持未初始化。检测这种情况并中止或重新启动输入是调用者的责任。

这是您的代码的修改版本,它说明了这两种可能性:

#include <stdio.h> 

#define MAX 10

void display(int matrix[][MAX], int size);

int main(void) {
    int n, degree;
    int matrix[MAX][MAX];

    printf("Enter the size of the matrix: ");  // assigning size of the matrix
    if (scanf("%d", &n) != 1 || n < 2 || n > 10) {
        // can't be bigger than a 10x10 matrix nor smaller than 2x2
        // aborting on invalid input
        printf("Invalid input.");
        return 1;
    }

    for (int i = 0; i < n; i++) {  // assigning the elements of matrix
        printf("Enter the row %d of the matrix: ", i);
        for (int j = 0; j < n; j++) {
            if (scanf("%d", &matrix[i][j]) != 1) {
                // restarting on invalid input
                int c;
                while ((c = getchar()) != '\n') {
                    if (c == EOF) {
                        printf("unexpected end of file\n");
                        return 1;
                     }
                }
                printf("invalid input, try again.\n");
                j--;
            }
        }
    }
    ...
于 2017-07-23T10:49:50.407 回答
0

因此,如果将来有人想知道我做了什么。这是我用来修复 if 语句的代码。我不希望放置任何大于 10000 的元素,因此如果输入字母或标点符号,生成的数字将大于此数字。因此,如果 (matrix[i][j] > 10000)。可能不是最好的方法,但它很有效而且很简单。

for (int i = 0; i < n; ++i) {  // assigning the elements of matrix

    printf("Enter the row %d of the matrix: ", i);

    for (int j = 0; j < n; ++j) {


    scanf("%d", &matrix[i][j]);

    if (matrix[i][j] > 10000) { // portion "fixed" 

       printf("Invlaid input");

       return 0;

       }

    }

}

我使用了一个打印语句来检查几个字母和字符输入的输出。最低输出在 30000 左右或以上。所以 10000 我认为是一个安全的条件。

于 2017-07-23T09:36:13.293 回答
0

尝试这个:

if (isalpha (matrix[i][j])) { 
    printf ("Invalid input.");
    return 0;
}
于 2017-07-23T08:37:08.257 回答