【发布时间】: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",&userChar);中,%s用于字符串。一个字符的正确指令是%c。 -
您很有可能通过写入超出范围来调用
scanf("%s",&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