字符 C 函数,对其行为的误解
Character C-function, misconception on its behaviour
一个练习要求编写一个函数:
读取仅在用户输入“\n”时结束的字母字符序列(无需记住序列)。
returns 1 如果大写字母的数量超过了用户输入的最大整数 m 的小写字母,否则为 0。
我尝试使用以下代码:
#include<stdio.h>
int read(int p,char c)
{
int M=0,m=0,d;
char A,Z,a,z;
while(c != '\n')
{
if(A<=c<=Z)
{
M++;
}
else if(a<=c<=z)
{
m++;
}
scanf("%c",&c);
}
if(M-m>0)
d=(m-M);
else
d=0;
if(d==0)
return 0;
else if (d<=p)
return 1;
}
int main()
{
int a,h;
char k;
scanf("%d", &h);
scanf("%c", &k);
a=read(h,k);
printf("%d\n",a);
return 0;
}
此时,尝试使用 gcc 命令执行程序,我注意到程序只取整数,比方说 2,然后返回 0,就好像它在没有进行第二次扫描的情况下进入函数一样关于角色。
除了关于程序和 c 函数的正式误解和错误,我很高兴你纠正,
我试图理解,因为正如他们所说,我正在努力自学,scanf
函数和函数的一般工作原理,何时以及谁优先考虑。
例如在函数 read
中,我不清楚我返回给函数的值是什么时候像我一样将更高的 if 值取下来。
这与您可能期望的不同
if(A<=c<=Z)
...出于各种原因。首先,A
和 Z
的值是未初始化的。其次,编写逻辑是为了让数学家阅读,而不是 C 编译器。
您几乎肯定想要这个:
if('A'<=c && c<='Z')
... 并删除四个变量 char A,Z,a,z;
请注意,'A'
和 'Z'
等字符常量的使用假定运行时环境使用 ASCII 字符集。如果您对更便携的解决方案感兴趣,可以查找 isupper()
和 islower()
一个练习要求编写一个函数:
读取仅在用户输入“\n”时结束的字母字符序列(无需记住序列)。
returns 1 如果大写字母的数量超过了用户输入的最大整数 m 的小写字母,否则为 0。
我尝试使用以下代码:
#include<stdio.h>
int read(int p,char c)
{
int M=0,m=0,d;
char A,Z,a,z;
while(c != '\n')
{
if(A<=c<=Z)
{
M++;
}
else if(a<=c<=z)
{
m++;
}
scanf("%c",&c);
}
if(M-m>0)
d=(m-M);
else
d=0;
if(d==0)
return 0;
else if (d<=p)
return 1;
}
int main()
{
int a,h;
char k;
scanf("%d", &h);
scanf("%c", &k);
a=read(h,k);
printf("%d\n",a);
return 0;
}
此时,尝试使用 gcc 命令执行程序,我注意到程序只取整数,比方说 2,然后返回 0,就好像它在没有进行第二次扫描的情况下进入函数一样关于角色。
除了关于程序和 c 函数的正式误解和错误,我很高兴你纠正,
我试图理解,因为正如他们所说,我正在努力自学,scanf
函数和函数的一般工作原理,何时以及谁优先考虑。
例如在函数 read
中,我不清楚我返回给函数的值是什么时候像我一样将更高的 if 值取下来。
这与您可能期望的不同
if(A<=c<=Z)
...出于各种原因。首先,A
和 Z
的值是未初始化的。其次,编写逻辑是为了让数学家阅读,而不是 C 编译器。
您几乎肯定想要这个:
if('A'<=c && c<='Z')
... 并删除四个变量 char A,Z,a,z;
请注意,'A'
和 'Z'
等字符常量的使用假定运行时环境使用 ASCII 字符集。如果您对更便携的解决方案感兴趣,可以查找 isupper()
和 islower()