这个程序应该通过一个零和一个数组,并计算有多少个零,一个和所有字符组合在一起。 但是,循环中的print语句会打印出一堆" 48"" 49" s。 即使正确计算了字符数,看起来它并没有从" if语句"中的指针中提取值,而是获取内存地址。
代码本身:
<input type="text" id="inputValue">
<button type="submit" class="btn btn-primary" onclick="myFunction()">Subscribe</button>
答案 0 :(得分:2)
请勿使用gets
。这是一个众所周知的安全问题的原因。请改用fgets
。
您没有理由对char*
使用labelPtr
类型。仅使用char label;
。
使用if (*labelPtr == 0)
不正确,因为*labelPtr
为char
且字符'0'
的值不等于整数常量0
。您需要将其与'0'
进行比较。 if (*labelPtr == '0')
。同样,请使用if (*labelPtr == '1')
要打印char
,请使用格式说明符%c
,而不是%d
。
printf("%c \n", *labelPtr);
如果使用%d
作为格式说明符,则获取整数值用于将字符编码为输出。对于ASCII编码,字符48
获得'0'
,字符49
获得'1'
。
以下是您发布的代码的更新版本。
#include <stdio.h> /* using printf, gets, BUFSIZ */
int main(int argc, char *argv[])
{
char input[BUFSIZ] = {};
int n = 0;
char label;
int zeroCount=0;
int oneCount=0;
fgets(input, sizeof(input), stdin);
while( input[n] )
{
label = input[n];
printf("%c \n", label);
if (label == '0')
{
zeroCount++;
}
if(label == '1')
{
oneCount++;
}
n++;
}
printf("The number of characters is %d \n", n);
printf("The number of zeros is %d \n", zeroCount);
printf("The number of ones is %d \n", oneCount);
}
答案 1 :(得分:1)
您正在阅读使用阅读字符的数字时感到困惑。当您使用fgets
(或任何其他功能)阅读时,您会阅读字符。您读取的字符是由数字值0-127
表示的ASCII字符(大多数情况下,都有宽字符支持)。请参阅ASCII Table前31个字符(ASCII值0-30
)是您的控件和空白字符(例如nul-character
,tab
,newline
,...) 127
(del)同样是非打印字符。余数31-126
组成可打印字符(包括可打印字符0-9
)
(注意:你永远不会使用gets
,因为它很容易被利用,缓冲区溢出已被从C11库中删除了)
请勿将数字0
与ASCII字符'0'
混淆或等同(请注意单引号)。
当您尝试打印每个字符时,在代码中,例如
printf("%d \n", *labelPtr);
您正在打印ASCII字符的ASCII值(十进制值)。您正在寻找'0'
和'1'
并获取48
和49
。这是因为字符'0'
的ASCII码为48
,而'1'
的ASCII码为49
。如果您想打印角色,则需要:
printf("%c\n", *labelPtr);
此外,您的计数永远不会注册任何内容。为什么?您正在测试0
和1
,而不是'0'
和'1'
。 (并注意到0
是 nul-character - 因此在测试为真之前你将超出字符串中的最后一个字符)。相反,你需要:
if (*labelPtr == '0')
zeroCount++;
if(*labelPtr == '1')
oneCount++;
完全放置并清理不需要/未使用的变量,您可以执行以下操作:
#include <stdio.h> /* using printf, gets, BUFSIZ */
int main (void)
{
char input[BUFSIZ] = "",
*labelPtr = input;
int n = 0,
zeroCount=0,
oneCount=0;
fgets (input, BUFSIZ, stdin);
for (; *labelPtr; labelPtr++, n++)
{
printf ("read ASCII char '%c' (%3d - decimal)\n",
*labelPtr, *labelPtr);
if (*labelPtr == '0')
zeroCount++;
if(*labelPtr == '1')
oneCount++;
}
printf("characters: %d\nzeros : %d \nones : %d \n",
n, zeroCount, oneCount);
}
示例使用/输出
$ echo "my 10 dogs have 100 fleas" | ./bin/zeroonect
read ASCII char 'm' (109 - decimal)
read ASCII char 'y' (121 - decimal)
read ASCII char ' ' ( 32 - decimal)
read ASCII char '1' ( 49 - decimal)
read ASCII char '0' ( 48 - decimal)
read ASCII char ' ' ( 32 - decimal)
read ASCII char 'd' (100 - decimal)
read ASCII char 'o' (111 - decimal)
read ASCII char 'g' (103 - decimal)
read ASCII char 's' (115 - decimal)
read ASCII char ' ' ( 32 - decimal)
read ASCII char 'h' (104 - decimal)
read ASCII char 'a' ( 97 - decimal)
read ASCII char 'v' (118 - decimal)
read ASCII char 'e' (101 - decimal)
read ASCII char ' ' ( 32 - decimal)
read ASCII char '1' ( 49 - decimal)
read ASCII char '0' ( 48 - decimal)
read ASCII char '0' ( 48 - decimal)
read ASCII char ' ' ( 32 - decimal)
read ASCII char 'f' (102 - decimal)
read ASCII char 'l' (108 - decimal)
read ASCII char 'e' (101 - decimal)
read ASCII char 'a' ( 97 - decimal)
read ASCII char 's' (115 - decimal)
read ASCII char '
' ( 10 - decimal)
characters: 26
zeros : 3
ones : 2
(注意: ( 10 - decimal)
下一行的'和'是'\n'
字符
仔细看看,如果您有其他问题,请告诉我。