在c中调整数组的特定单元格

时间:2018-01-14 04:09:59

标签: c string resize realloc

#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"

2 个答案:

答案 0 :(得分:1)

请勿使用gets使用fgets

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

不需要转换calloc的返回值,因为void*会隐式转换为char*calloc可能会返回NULL - 您没有在此处加入签到。

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

main()的{​​{1}}值不确定。你没有在b中输入。

b

然后你if( scanf("%d",&b)!= 1){ fprintf(stderr,"Error in input"); exit(EXIT_FAILURE); } - 编辑。但不明白为什么。如果您认为将内存缩小到realloc4-2字节会帮助您获得2,那么您在许多方面都是错误的。它不会。

你可以做的是 - 为"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); 。还剩下一件事 - 将代码片段放入代码中。

答案 1 :(得分:0)

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

  

如果有其他方式则没问题。

我会指出一个简单的解决方案,在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