字符串不打印

时间:2014-04-14 13:20:26

标签: c string pointers heap

首先,我知道在这种情况下使用malloc是不好的做法;我只是好奇为什么以下代码不起作用(逻辑上,没有编译或运行时错误)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


//function to remove n number of characters from replicated string
char* remove_beginning(int n, char a[], int size)
{

int i;
char *p=malloc(size-(1+n));
for(i = n ;i < size-1; i++)
   {
     p[i] = a[i];  
   }

return p;

}



int main(){


char *str = "123456789";
char *second = remove_beginning(5, str, strlen(str));

printf("%s\n", second);
return 0;

}

3 个答案:

答案 0 :(得分:2)

p [i]应该是p [i-n],你还需要复制空值:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


//function to remove n number of characters from replicated string
char* remove_beginning(int n, char a[], int size) {
  int i;
  char *p=malloc(size-(n-1));
  for(i = n ;i <= size; i++) {
     p[i-n] = a[i];  
  }

  return p;
}


int main(){
  char *str = "123456789";
  char *second = remove_beginning(5, str, strlen(str));

  printf("%s\n", second);
  return 0;
}

答案 1 :(得分:1)

您需要更改函数中的循环体和malloc

char *p=malloc(size-(n-1));
for(i = 0 ;i <= size - n; i++)
{
    p[i] = a[i+n];
}

答案 2 :(得分:1)

当删除字符串的开头也可以使用strncpy:

char tmp1[20] = "123456789";
char tmp2[20];
strncpy(tmp2, tmp1 + 5, 4);

我知道它并没有直接回答你的问题,但我发布它以显示更好的&#34;删除字符串开头的方法。 strncpy可用于复制完整的字符串,字符串的开头或结尾。