将字符串中的1-3等速记符号扩展为C中的字符串数组

将字符串中的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

假设我有一个字符串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 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();
}