C语言 如何将空结束符附加到索引char指针的末尾



我运行了下面的代码,它崩溃了,while循环永远运行。当我调试这段代码时,我在*(pointer+cnt)=''处发现了问题;空字符永远不会存在。我不知道如何在这里附加空终止符,以便程序不会崩溃。

#include <stdio.h>
#include <stdlib.h>
char* decimal_binary(int);
int main()
{
   int n;
   char *ptr=NULL;
   printf("Enter the numbern");
   scanf("%d",&n);
   ptr=decimal_binary(n);
   //printing out the characters
   while(ptr!='')
   {
     printf("%c",*ptr);
     ptr++;
   }
   free(ptr);
   return 0;
}
char* decimal_binary(int n)
{
  int c,d,cnt=0;
  char *pointer=(char*)malloc(8+1);
  if(pointer==NULL)
     exit(EXIT_FAILURE);
  for(c=7;c>=0;c--)
  {
    d=n>>c;
    if(d&1)
        *(pointer+cnt)=1+'0';
    else
        *(pointer+cnt)=0+'0';
    cnt++;
   }
//Null not getting added at the end of this sequence.Hence while loop in    main runs forever.
*(pointer+cnt)='';
return pointer;
}

你选择写:

while(ptr!='')

这是一个有趣的写作方式:

while (ptr != 0)

或:

while (ptr != NULL)

你想写的地方

while (*ptr != '')

*(pointer+cnt)的常规写法为pointer[cnt]

不能释放自增指针;您必须释放由malloc() -或calloc()realloc()或…返回的内容

保留binary_decimal()返回值的副本并释放该副本(或增加副本并释放ptr中的值)。

您可以在下面的代码中使用两个binary_decimal()函数中的任何一个:
#include <stdio.h>
#include <stdlib.h>
char *decimal_binary(int);
int main(void)
{
    int n;
    char *ptr = NULL;
    printf("Enter the numbern");
    scanf("%d", &n);
    ptr = decimal_binary(n);
    char *cpy = ptr;
    //printing out the characters
    while (*ptr != '')
    {
        printf("%c", *ptr);
        ptr++;
    }
    putchar('n');
    free(cpy);
    return 0;
}
char *decimal_binary(int n)
{
    int cnt = 0;
    char *pointer = (char *)malloc(8 + 1);
    if (pointer == NULL)
        exit(EXIT_FAILURE);
    for (int c = 7; c >= 0; c--)
    {
        int d = n >> c;
        if (d & 1)
            pointer[cnt] = 1 + '0';
        else
            pointer[cnt] = 0 + '0';
        cnt++;
    }
    pointer[cnt] = '';
    return pointer;
}

或:

char *decimal_binary(int n)
{
    int cnt = 0;
    char *pointer = (char *)malloc(8 + 1);
    if (pointer == NULL)
        exit(EXIT_FAILURE);
    for (int c = 7; c >= 0; c--)
        pointer[cnt++] = ((n >> c) & 1) + '0';
    pointer[cnt] = '';
    return pointer;
}

还可以进一步压缩(甚至可读性更差):

char *decimal_binary(int n)
{
    char *pointer = (char *)malloc(8 + 1);
    if (pointer == NULL)
        exit(EXIT_FAILURE);
    for (int c = 7; c >= 0; c--)
        pointer[7 - c] = ((n >> c) & 1) + '0';
    pointer[8] = '';
    return pointer;
}

对于一个9字节的缓冲区,你可以很好地在main()中分配一个局部变量,并将地址传递给decimal_binary(),因此它不需要使用malloc(), main()也不需要使用free:

#include <stdio.h>
#include <stdlib.h>
void decimal_binary(int, char *);
int main(void)
{
    int n;
    char buffer[9];
    char *ptr = buffer;
    printf("Enter the numbern");
    scanf("%d", &n);
    decimal_binary(n, buffer);
    while (*ptr != '')
    {
        printf("%c", *ptr);
        ptr++;
    }
    putchar('n');
    return 0;
}
void decimal_binary(int n, char *pointer)
{
    for (int c = 7; c >= 0; c--)
        pointer[7 - c] = ((n >> c) & 1) + '0';
    pointer[8] = '';
}

最新更新