删除C中的最后一个字符

时间:2015-01-13 11:35:00

标签: c

#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;多次。

2 个答案:

答案 0 :(得分:5)

你有很多错误

  1. 您为输入字符串副本分配了额外的空间,因此您需要sizeof(int) l而不是char {{1}这是部分正确的,因为你还需要l终止字符,因此需要int '\0' s,因此第一个malloc行应该读取

    1 + l
  2. 您检查char是否成功,但仍继续取消引用可能的tab2 = malloc(1 + l); 指针,如果malloc失败,您执行的操作无关紧要但不能derefrence一个NULL指针,这个

    malloc

    应该是

    NULL
  3. 您永远不会将通过if (tab2 == NULL) printf("blad"); 读取的数据复制到新分配的缓冲区,您应该将字节复制到if (tab2 == NULL) return -1; /* or anything that will abort execution */

    fgets()
  4. 复制tab2函数中的字符后,不会添加终止空字节。你必须添加

    strcpy(tab2, tab1);
    

    deleteLastChar()的{​​{1}}循环结束时。

  5. tab1[rozmiar - 1] = '\0'; 函数中的for deleteLastChar(),返回后,该行永远不会到达,所以没有意义,也不应该free 1}},因为它是s的输入参数,你应该在调用函数中执行它。

  6. 这是您的代码的副本,已修复

    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()没有意义