【问题标题】:Resize specific cells of array in c在c中调整数组的特定单元格
【发布时间】:2018-01-14 04:09:58
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>

char *readline()
{
   char s[256],*ds;
   printf("Give string: ");
   gets(s);
   ds = (char *) calloc(strlen(s)+1,sizeof(char));
   strcpy(ds,s);
   return ds;
}


main()
{
   char *s1,*s2;
   int a,b;
   s1=readline();
   printf("Start:");
   scanf("%d",&a);
   printf("End:");
   s2=(char*)realloc(s1,b-a);
   puts(s2);
   return 0;

}

我有这段代码,我想调整 s1 数组的特定单元格的大小,这些单元格由变量 ab 确定。 例如。如果我给出字符串"Hello" 和整数a=2b=4,那么我希望程序打印"ell"

【问题讨论】:

  • 为什么需要realloc 这样做?
  • 如果有其他方法那就没问题了。

标签: c string resize realloc


【解决方案1】:

不要使用gets,而是使用fgets

对于fgets,您将使用if( fgets( s,256, stdin)!= NULL ){ /*Got input in s*/ }。 您也将\n 作为输入。 s[strcspn(s,"\n")]=0 将用\0 覆盖\n

不需要calloc 的转换返回值,因为void* 将隐式转换为char*calloc 可能会返回 NULL - 你没有在其中包含签入。

ds = calloc(strlen(s)+1,sizeof(char));
if( NULL == ds ){
    perror("calloc: error");
    exit(EXIT_FAILURE);
}

main() 中,b 的值是不确定的。你没有接受b 的输入。

if( scanf("%d",&b)!= 1){
    fprintf(stderr,"Error in input");
    exit(EXIT_FAILURE);
} 

那么你realloc-ed。但不清楚为什么。如果您认为将内存缩小到4-22 字节将帮助您获得"ell",那么您在很多方面都错了。不会的。

您可以做的是 - 在 s2 中为此分配内存。

if(b<a){
  fprintf(stderr,"End must be greater than beginnning\n");
  exit(EXIT_FAILURE);

}
s2 = malloc(b-a+1);
if(!s2){
   perror("calloc: error");
   exit(EXIT_FAILURE);
}
memcpy(s2,s1+a,b-a);
s2[b-a]=0;
puts(s2);

这将打印您想要的相关"ell"。还剩下一件事 - 将代码 sn-ps 放入代码中。

【讨论】:

  • 哦,我知道我的想法从一开始就错了。不过感谢您的回答!
【解决方案2】:

由于您对其他解决方案持开放态度:

如果有其他方法那就没问题了。

我会为您指出一个简单的解决方案,您可以在 b 处终止原始字符串并跳过所需数量的字符 a。 (注意:在C char 数组中从索引0 开始);

这就是想法:

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

char *splice(char *str, int s, int e)
{
    str[e]=0;
    return (str+s-1);
}

int main()
{
   char *after;

   int a=2;
   int b=4; 

   char original[] = { 'H', 'e', 'l' , 'l' , 'o', 0 };       

   after = splice(original,a,b);

   printf("My new string = %s", after);

   return 0;
}

输出:

My new string = ell

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多