【问题标题】:isdigit() and isalpha() return type 0? or whats going on here.?isdigit() 和 isalpha() 返回类型 0?或者这里发生了什么。?
【发布时间】:2016-03-07 04:46:05
【问题描述】:
#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 函数从用户那里获取一个字符和数字, 用户输入的数字是多少个字母和行 打印输出。

所以如果用户输入'a'并且数字'3'输出是abc \n bcd \n cde 我在主要的验证方面遇到了麻烦。使用函数 isalpha() 检查返回值是否为 0,如果是,则继续提示用户输入字符 我尝试为 isdigit() 做同样的事情,但它进入了一个无限循环 有没有人见过这个,它与缓冲区或标准输入有什么关系吗??*/

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;
    }
}

【问题讨论】:

  • scanf("%s",&amp;userChar); 中,%s 用于字符串。一个字符的正确指令是%c
  • 您很有可能通过写入超出范围来调用scanf("%s",&amp;userChar); 上的未定义行为
  • sizeof char 为1,不需要除以sizeof(letters[i]);如果在字母中找不到 initChar,则不会初始化它,未定义的行为。您忽略了 scanf -> 未定义行为的返回值。
  • isdigit() 和 isalpha() 返回 true/false(其中 false 为 0),因此您的问题表明参数不是数字而不是 a...z,A...Z跨度>
  • 关于这种行:while(isdigit(userNum) == 0){ 在 C 中,将返回的 bool 值与 0 进行比较是不必要的,只会使代码混乱。建议使用:while( !isdigit(userNum) ) {isalpha() 的调用存在类似的考虑。

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


【解决方案1】:

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

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

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

【讨论】:

  • 读取字符没有问题,读取时出现问题 scanf("%d",&userNum); while(isdigit(userNum) == 0){
  • @Mikovsky 程序似乎运行良好,并不意味着没有任何问题。您将数据写入不应写入数据的内存,这是未定义的行为,这意味着您的整个程序格式错误。
【解决方案2】:

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

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

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

【讨论】:

  • 如果你真的想一次读一个字符,scanf("%c",...) 很傻;只需使用getc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2021-12-02
  • 2021-08-04
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多