#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数组的特定单元格,这些单元格由变量a
和b
确定。
例如。如果我提供字符串"Hello"
以及整数a=2
和b=4
,那么我希望程序打印"ell"
。
答案 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);
}
- 编辑。但不明白为什么。如果您认为将内存缩小到realloc
或4-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