isdigit()和isalpha()返回类型0?或者最新消息。

时间:2016-03-07 04:46:05

标签: c function validation return-value header-files

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

void printSquare( char c, int size);

int main(){

    int userNum;
    char userChar;

    printf("Enter a character : \n");
    scanf("%s",&userChar);

    while(isalpha(userChar) == 0){
        printf("Enter a character : \n");
        scanf("%s",&userChar);
    }

    printf("Enter a number(3-10) : \n");
    scanf("%d",&userNum);

    while(isdigit(userNum) == 0){
        printf("Enter a number(3-10) : \n");
        scanf("%d",&userNum);
    }   

    printSquare(userChar,userNum);

}

/ * printSquare函数从用户获取一个char和number, 用户输入的数字是字母和行的数量 打印到输出。

因此,如果用户输入了&#39;和号码&#39; 3&#39;输出是abc \ n bcd \ n cde 我在主要验证方面遇到问题。使用函数isalpha() 检查返回值是否为0,如果是,则继续提示用户输入char 我尝试为isdigit()做同样的事情,但它进入了一个infite循环 有没有人见过这个,它与缓冲区或stdin有什么关系?* /

void printSquare( char c, int size){
    char letters[27] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    int initChar;

    for (int i = 0; i < sizeof(letters)/sizeof(letters[i]); i++)
    {
        if (c == letters[i])
        {
            initChar = i;
            printf("FOUND IT - > %c\n",letters[i]);
        }
    }

    for (int i = 0; i < size; i++)
    {
        for (int j = initChar; j <  initChar + size; j++)
        {
            printf("%c",letters[j % 27] );
        }
        printf("\n");
        initChar+=1;
    }
}

2 个答案:

答案 0 :(得分:3)

您的代码中有未定义的行为。您告诉scanf读取字符串,但只提供指向单个字符的指针。非空字符串至少有两个字符:字符串中的实际字符加上字符串终止符。

scanf写入字符串终止符时,它将写入内存中不应写入的位置。

要阅读单个字符,您应使用"%c"格式。参见例如this scanf (and family) reference了解有关格式的更多信息。

答案 1 :(得分:0)

isdigit检查您的输入是char'0''1',...

它不会检查您的输入是否为integers。请注意,char '0'int 0不同。

此外,您应该使用scanf("%c",&userChar);代替scanf("%s",&userChar);,因为userChar是一个字符,而不是字符串。