#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ROZ 100
char *deleteLastChar(char* s)
{
int rozmiar,i;
char *tab1;
rozmiar=strlen(s);
tab1=(char*)malloc((rozmiar-1)*sizeof(int));
for(i=0;i<(rozmiar-1); i++)
{
tab1[i]=s[i];
}
return tab1;
free(s);
}
main()
{
char tab1[ROZ], *tab2;
int l,i,p,a;
printf("podaj napis\n");
fgets(tab1, 100, stdin);
l=strlen(tab1);
tab2=malloc(l*sizeof(int));
if (tab2==NULL)
printf("blad");
for(i=0;i<l;i++)
{
tab2 = deleteLastChar(tab2);
p = strlen(tab2);
for(a=0;a<p;a++)
{
printf("%c",tab2[a]);
}
}
}
您好 我试图制作一个程序,它一遍又一遍地从字符串中删除最后一个字符,直到它中没有字符为止。它必须通过缩短新的arrray并将之前的数组重写到动态数组中来完成。程序正在编译而没有任何错误,尽管它并不像它所要做的那样工作。输入后输出&#34; e&#34;多次。
答案 0 :(得分:5)
你有很多错误
您为输入字符串副本分配了额外的空间,因此您需要sizeof(int)
l
而不是char
{{1}这是部分正确的,因为你还需要l
终止字符,因此需要int
'\0'
s,因此第一个malloc行应该读取
1 + l
您检查char
是否成功,但仍继续取消引用可能的tab2 = malloc(1 + l);
指针,如果malloc
失败,您执行的操作无关紧要但不能derefrence一个NULL
指针,这个
malloc
应该是
NULL
您永远不会将通过if (tab2 == NULL)
printf("blad");
读取的数据复制到新分配的缓冲区,您应该将字节复制到if (tab2 == NULL)
return -1; /* or anything that will abort execution */
。
fgets()
复制tab2
函数中的字符后,不会添加终止空字节。你必须添加
strcpy(tab2, tab1);
在deleteLastChar()
的{{1}}循环结束时。
tab1[rozmiar - 1] = '\0';
函数中的for
deleteLastChar()
,返回后,该行永远不会到达,所以没有意义,也不应该free
1}},因为它是s
的输入参数,你应该在调用函数中执行它。
这是您的代码的副本,已修复
deleteLastChar()
BTW,使用更多的空格看起来不是更具可读性吗?
注意:哦,并且无需在c中投射free
,而deleteLastChar()
会消耗尾随char *deleteLastChar(char* s)
{
int rozmiar,i;
char *tab1;
if (s == NULL)
return NULL;
rozmiar = strlen(s);
if(rozmiar == 0)
return NULL;
tab1 = malloc(rozmiar);
if (tab1 == NULL)
return NULL;
for (i = 0 ; i < (rozmiar - 1) ; i++)
{
tab1[i] = s[i];
}
tab1[rozmiar - 1] = '\0';
return tab1;
}
int main()
{
char tab1[ROZ], *tab2;
int l, i, p, a;
printf("podaj napis\n");
fgets(tab1, 100, stdin);
l = strlen(tab1);
tab2 = malloc(1 + l);
if (tab2 == NULL)
return -1;
strcpy(tab2, tab1);
for (i = 0 ; i < l ; i++)
{
char *result;
result = deleteLastChar(tab2);
if (tab2 != NULL)
{
p = strlen(tab2);
for (a = 0 ; a < p ; a++)
{
printf("%c", tab2[a]);
}
free(tab2);
printf("\n");
tab2 = result;
}
else
{
free(tab2);
return -1;
}
}
free(tab2);
return 0;
}
,因此您可能需要删除这一点。
答案 1 :(得分:0)
我可以立即看到您的代码有两个问题
您正在将tab2传递给deleteLastChar。 tab2刚刚分配,数据未分配给tab2。我认为你的意图是通过tab1
在deleteLastChar()中的return语句之后调用free()没有意义