【问题标题】:String prints nothing字符串不打印
【发布时间】:2014-05-28 11:32:07
【问题描述】:

首先,我知道在这种情况下使用 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;

}

【问题讨论】:

  • 在哪些方面不起作用?
  • 它不打印任何东西
  • 我认为 p[i] 应该是 p[i-n]。另外,不要忘记最后的 null。
  • 在传递字符串长度时建议避免使用参数名size。或者用remove_beginning(5, str, strlen(str) + 1);调用函数

标签: c string pointers heap-memory


【解决方案1】:

p[i] 应该是 p[i-n] 并且您还需要复制 null:

#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;
}

【讨论】:

  • 代码仍然无法为终止的0/NUL/'\0'/null分配内存。另外至少在答案中正确缩进代码。
  • 应该是size-(n-1)
【解决方案2】:

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

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

我知道它不能直接回答您的问题,但我发布它是为了展示一种“更好”的删除字符串开头的方法。 strncpy 可用于复制完整的字符串、字符串的开头或结尾。

【讨论】:

  • 不错的答案!虽然,是的;不是我要找的那个:p
【解决方案3】:

你需要在你的函数中改变循环体和 malloc

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

【讨论】:

  • 即使没有 null,也不应该打印(尽管最后可能会出现垃圾)?
  • 此代码从nth 开始复制n 元素。这不是 OP 所渴望的。
  • 根据您的代码,生成的字符串始终为 n char 长,尽管它应该是 size-n 长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2019-05-08
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多