Tengo datos en el siguiente formato \a,b,c,d/ donde a,b son cadenas de letras y números; c, d son números enteros.
Intenté usar el formato \%s,%s,%d,%d/ para escanearlo, pero eso hace que a,b,c,d/ se escaneen en la primera cadena en lugar de solo a.
¿Hay algo que pueda escribir en el formato para lograr el resultado deseado?
Puede usar la siguiente cadena de formato para usar comas como delimitadores:
"\\%[^,],%[^,],%d,%d/"La idea es decirle a scanf que lea cualquier cosa que no sea una coma para cada cadena, luego lea la coma delimitadora y continúe.
Aquí hay un ejemplo (¡malo e inseguro!):
char a[100], b[100]; int c=0, d=0; scanf("\\%[^','],%[^','],%d,%d/", a, b, &c, &d); printf("%s, %s, %d, %d\n", a, b, c, d);En código real, querrás escribir algo más seguro. Por ejemplo, puede usar fgets para leer una línea completa de entrada y luego reutilizar la misma cadena de formato con sscanf para analizarla.
Lea atentamente la documentación de fscanf(3) .
Podrías intentar algo como
char str1[80]; char str2[80]; memset (str1, 0, sizeof(str1)); memset (str2, 0, sizeof(str2)); int n3 = 0, n4 = 0; int pos = -1; if (scanf ("\\ %79[A-Za-z0-9], %79[A-Za-z0-9], %d, %d /%n", str1, str2, &n3, &n4, &pos) >= 4 && pos > 0) { // be happy with your input } else { // input failure } Eso no funcionará si tienes una noción más amplia de las letras, como la é francesa o la Ы rusa; ambas son letras individuales existentes en UTF-8 pero representadas en varios bytes.
Agregué algunos espacios (principalmente para facilitar la lectura) en la cadena de formato (pero scanf a menudo se salta espacios de todos modos, por ejemplo, para %d ). Si no acepta espacios, como una línea de entrada como \AB3T, C54x, 234, 65/ , lea cada línea con getline(3) o fgets(3) y analícela manualmente (quizás con la ayuda de sscanf y strtol ...). ¡Observe que %d está omitiendo espacios! También estoy limpiando las variables para obtener un comportamiento más determinista. Tenga en cuenta que %n le da la cantidad de caracteres leídos (¡en realidad, bytes!) y que scanf devuelve la cantidad de elementos escaneados.
Mi solución directa:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char a[10010]; gets(a); int l = strlen(a); char storded_first[10010], storded_second[10010]; char for_int_c[10010], for_int_d[10010]; int c,d; char first_symbol, last_symbol; int i; int cnt = 0; int j=0; for(i=0; i<l; i++) { if(a[i]=='\\') first_symbol = a[i]; else if(a[i]=='/') last_symbol = a[i]; else if(a[i]==',') { cnt++; j=0; } else if(cnt==0) { storded_first[j]=a[i]; j++; } else if(cnt==1) { storded_second[j]=a[i]; j++; } else if(cnt==2) { for_int_c[j]=a[i]; j++; } else if(cnt==3) { for_int_d[j]=a[i]; j++; } } c = atoi(for_int_c); d = atoi(for_int_d); printf("%c%s, %s, %d, %d%c\n",first_symbol, storded_first, storded_second, c, d, last_symbol); return 0; }