Malloc 或 Calloc return 字符串中的意外值

Malloc or Calloc return unexpected values in string

我正在尝试创建一个动态内存分配字符串,以便 return 是一个删除所有元音的字符串。一开始,一些字符串工作正常,但突然其中一些 returns 有一个额外的值,这使我无法通过测试,并且我无法完成任务。这是代码:

    #include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *disemvowel(const char *str)
{
  char buf[100];
  unsigned long i,j=0,nextsize=0;
  for(i=0;i<strlen(str);i++)
  {
   if(*(str+i)=='a' || *(str+i)=='A' || *(str+i)=='e' || *(str+i)=='E' || *(str+i)=='i' || *(str+i)=='I' || *(str+i)=='o' || *(str+i)=='O' || *(str+i)=='u' || *(str+i)=='u') continue;
   else{
        buf[j]=str[i];
        j++;
        nextsize++;
   }
  }
  char *disemvoweStr=(char *) malloc((nextsize)*sizeof(char));
  strcpy(disemvoweStr,buf);
  printf("\nProblem=");
  puts(str);
  printf("\nSolution");
  puts(disemvoweStr);
  return disemvoweStr;
}

其中一些正在工作,return 正确答案如下:

问题=这个网站是为失败者设计的 LOL!

解决方案Ths wbst s fr lsrs LL!

问题=没有冒犯但是, 你的写作是我读过的最糟糕的文章之一

解决方案N ffns bt, Yr wrtng s mng th wrst 'v vr rd

问题=你是什么共产主义者?

Solution=Wht r y, cmmnst?

但是其中一些 return 垃圾值和测试失败= 问题=Yyy!

解决方案Yyy!�

问题=mVcoyIbLyAOpsOzRhwQUiWlwRHuhjUQDMBVSLelPRGrhzWagWhJzCVssmjQoFyLZVOxc

解决方案QQmTvvWfspPLzfNgNRGfcVrTMTtdtFNjKwmpdwbvNFXmUjydZCUxwmyYbsZfrwCmrbMzknqTNJdchjgMYHcPfUVNdHPRjbcgmVcybLyps��

知道为什么我最后得到 ���� 吗? 这个错误的解决方法和原因是什么? 请帮助我

您不能空终止缓冲区。因此 strcpy 只会复制 buf 的内容,直到遇到空字符,这是未定义的行为。

for 循环之后添加:

buf[j] = 0;

同样在 malloc((nextsize) * sizeof(char)) 中,nextsize 不包含空字符。实际上你根本不需要 nextsize,因为它只是镜像 j。所以你应该有:

char* disemvoweStr = malloc(j + 1);

顺便说一句,不需要 (char*) 强制转换,根据定义 sizeof(char) 是 1。