指向char数组的问题

时间:2018-04-10 03:40:25

标签: c pointers char

这个程序应该通过一个零和一个数组,并计算有多少个零,一个和所有字符组合在一起。 但是,循环中的print语句会打印出一堆" 48"" 49" s。 即使正确计算了字符数,看起来它并没有从" if语句"中的指针中提取值,而是获取内存地址。

代码本身:

<input type="text" id="inputValue">
  <button type="submit" class="btn btn-primary" onclick="myFunction()">Subscribe</button>

2 个答案:

答案 0 :(得分:2)

  1. 请勿使用gets。这是一个众所周知的安全问题的原因。请改用fgets

  2. 您没有理由对char*使用labelPtr类型。仅使用char label;

  3. 使用if (*labelPtr == 0)不正确,因为*labelPtrchar且字符'0'的值不等于整数常量0 。您需要将其与'0'进行比较。 if (*labelPtr == '0')。同样,请使用if (*labelPtr == '1')

  4. 要打印char,请使用格式说明符%c,而不是%d

    printf("%c \n", *labelPtr);
    

    如果使用%d作为格式说明符,则获取整数值用于将字符编码为输出。对于ASCII编码,字符48获得'0',字符49获得'1'

  5. 以下是您发布的代码的更新版本。

    #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-charactertabnewline,...) 127(del)同样是非打印字符。余数31-126组成可打印字符(包括可打印字符0-9

注意:你永远不会使用gets,因为它很容易被利用,缓冲区溢出已被从C11库中删除了)

请勿将数字0与ASCII字符'0'混淆或等同(请注意单引号)。

当您尝试打印每个字符时,在代码中,例如

    printf("%d \n", *labelPtr);

您正在打印ASCII字符的ASCII值(十进制值)。您正在寻找'0''1'并获取4849。这是因为字符'0'的ASCII码为48,而'1'的ASCII码为49。如果您想打印角色,则需要:

    printf("%c\n", *labelPtr);

此外,您的计数永远不会注册任何内容。为什么?您正在测试01,而不是'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'字符

仔细看看,如果您有其他问题,请告诉我。