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。
我正在尝试创建一个动态内存分配字符串,以便 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。