将字符串中的1-3等速记符号扩展为C中的字符串数组
假设我有一个字符串XYZ1-3 我想将其转换为字符串数组。 XYZ1, XYZ2, XYZ3将字符串中的1-3等速记符号扩展为C中的字符串数组,c,C,假设我有一个字符串XYZ1-3 我想将其转换为字符串数组。 XYZ1, XYZ2, XYZ3 在C语言中有一种优雅的方法吗?\include #include <stdio.h> #include <stdlib.h> #include <string.h> char **expand(const char *string, int *num){//num : out var char *id = strdup(string); int st
在C语言中有一种优雅的方法吗?
\include
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **expand(const char *string, int *num){//num : out var
char *id = strdup(string);
int start, end, len;
sscanf(string, "%*[A-Z]%n%d-%d", &len, &start, &end);
id[len] = '\0';
*num = end-start+1;
char **array = malloc(*num * sizeof(char*));
for(int i=0;i < *num ;++i){
len = snprintf(NULL, 0, "%s%d", id, start + i);
array[i] = malloc(++len);
sprintf(array[i], "%s%d", id, start + i);
}
free(id);
return array;
}
int main(){
int n;
char **array = expand("XYZ1-3", &n);
for(int i=0;i<n;++i){
printf("%s\n", array[i]);
free(array[i]);
}
free(array);
return 0;
}
#包括
#包括
字符**扩展(常量字符*字符串,int*num){//num:out变量
char*id=strdup(字符串);
int开始,结束,len;
sscanf(字符串“%*[A-Z]%n%d-%d”、&len、&start、&end);
id[len]='\0';
*num=结束-开始+1;
字符**数组=malloc(*num*sizeof(字符*);
对于(int i=0;i<*num;++i){
len=snprintf(NULL,0,“%s%d”,id,start+i);
数组[i]=malloc(++len);
sprintf(数组[i],%s%d],id,start+i);
}
免费(id);
返回数组;
}
int main(){
int n;
字符**数组=展开(“XYZ1-3”,&n);
for(int i=0;i=0;--i);
如果(字符串[i]!='-')返回0;//格式错误
对于(i=i-1;isdigit(字符串[i])&&i>=0;--i);
返回i+1;
}
字符**扩展(常量字符*字符串,int*num){//num:out变量
char*id=strdup(字符串);
int开始,结束,len;
len=id_长度(字符串);
sscanf(字符串+长度、%d-%d、&start和end);
id[len]='\0';
*num=结束-开始+1;
字符**数组=malloc(*num*sizeof(字符*);
对于(int i=0;i<*num;++i){
len=snprintf(NULL,0,“%s%d”,id,start+i);
数组[i]=malloc(++len);
sprintf(数组[i],%s%d],id,start+i);
}
免费(id);
返回数组;
}
试试这个--
#包括
#包括
#包括
void main()
{
整数,i,c,d,p,j;
char-arr[50];
char-arr2[50];
char-arr3[30][30];
煤焦温度[30];
scanf(“%s”,arr);
len=strlen(arr);//计算整个输入的长度
对于(i=0;i“是否有一种优雅的方式在C中实现它?”-是的。向我们展示优雅的方式,Maroun,但是让我们假设我有另一种特殊的情况,字符串的初始部分可以有数字。即XY1Z1-2(其输出应该是XY1Z1,XY1Z2),那么显然这段代码失败了。
#include <ctype.h>
int id_length(const char *string){
//return length of id part.
int i, len;
for(i=0;string[i];++i);
if(i==0)return 0;
for(i=i-1;isdigit(string[i]) && i>=0;--i);
if(string[i]!='-') return 0;//bad format
for(i=i-1;isdigit(string[i]) && i>=0;--i);
return i+1;
}
char **expand(const char *string, int *num){//num : out var
char *id = strdup(string);
int start, end, len;
len = id_length(string);
sscanf(string+len, "%d-%d", &start, &end);
id[len] = '\0';
*num = end-start+1;
char **array = malloc(*num * sizeof(char*));
for(int i=0;i < *num ;++i){
len = snprintf(NULL, 0, "%s%d", id, start + i);
array[i] = malloc(++len);
sprintf(array[i], "%s%d", id, start + i);
}
free(id);
return array;
}
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
int len,i,c,d,p,j;
char arr[50];
char arr2[50];
char arr3[30][30];
char temp[30];
scanf("%s",arr);
len=strlen(arr);//calculating length of entire input
for(i=0;i<len;i++)
{
if(arr[i]!='-')
arr2[i]=arr[i];//arr2[] will hold the string without the numeral
else
break;
}
c=(int)arr[i-1]-48;//char is converted into int
d=(int)arr[i+1]-48;
for(i=0;i<len-3;i++)
temp[i]=arr2[i];
p=0;
for(i=c;i<=d;i++)
{
temp[len-3]=(char)(i+48);//int is converted into character
for(j=0;j<=len-3;j++)
arr3[p][j]=temp[j];//this 2d array holds array of strings
p++;
}
for(i=0;i<=(d-c);i++)
{
for(j=0;j<=len-3;j++)
{
printf("%c",arr3[i][j]);//printing the strings one by one
}
printf("\n");
}
getch();
}