2015-05-02 2 views
2

Я хочу, чтобы разобрать мою строку, используя sscanf:Sscanf - разбор с различными разделителями

char string[] = "/home/my/estf 122,323 452,323 662,343"; 

Первый элемент строки это путь и рядом находятся Интс, где запятая или белые символы являются разделителями. Это мой полный код:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 

    char string[] = "/home/my/estf 122,323 452,323 662,343"; 

    char path[100]; 
    int int1, int2, int3, int4, int5, int6; 

    sscanf(string, "%s %d[^,] %d %d[^,] %d %d[^,] %d", 
      path, &int1, &int2, &int3, &int4, &int5, &int6); 
    printf("Path:%s INT1:%d INT2:%d INT3:%d INT4:%d INT5:%d INT6:%d\n", 
      path, int1, int2, int3, int4, int5, int6); 
    return 0; 
} 

Что это за ошибка? Можно ли расширять его, анализировать динамические числа int (точно не 6) и хранить его в целочисленном массиве?

+3

'» % s% d,% d% d,% d% d,% d "' – BLUEPIXY

+1

Ну, я не знаю sscanf, но думаю, вам нужно удалить пробелы между '% d [^,]' и '% d' – SDJMcHattie

+0

@BLUEPIXY, thx он работает. Но можно ли его расширять, анализировать динамические числа int и хранить его в целых массивах? – Bakus123

ответ

1

Вы можете сделать что-то вроде этого:

char a[3][16], z; 
int b[8] = {0}; 
char x[] = "/home/my/estf 122,323 452,323 662,343", y[64]; 
sscanf(x, "%c %[^/ ,] %c %[^/] %c %[^/ ] %d %c %d %d %c %d %d %c %d", &z, a[0], &z, a[1], &z, a[2], &b[0], &z, &b[1], &b[2], &z, &b[3], &b[4], &z, &b[5]); 
for (int i = 0; i < 3; i++) { 
    printf("%s ", a[i]); 
} 
for (int i = 0; b[i] != 0; i++) { 
    printf("%d ", b[i]); 
} 

Там могут быть более эффективные методы, чтобы сделать это, но с использованием sscanf вы должны сделать этот путь. Вы даже можете преобразовать действительно длинную линию sscanf в цикл.

При использовании sscanf вы должны использовать символы, которые вы указываете в отрицательном сканировании. Таким образом, в случае такого вида сканирования: [^ /] будет читать все символы до первого появления /. Но, указатель будет по-прежнему на / в исходной строке. Вы должны использовать это / и продолжать читать дальше.

для получения дополнительной информации о том, как sscanf работает, посмотрите на man sscanf

1

Можно ли продлить его, чтобы проанализировать динамические числа Интс (не 6 точно) и хранить его в целочисленном массиве?

Вы можете использовать strtol в цикле:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char str[] = "/home/my/estf 122,323 452,323 662,343"; 
    char path[100]; 
    int ai[32]; 
    char *ptr; 
    int n = 0; 

    ptr = strchr(str, ' '); 
    sprintf(path, "%.*s", ptr - str, str); 
    while (*ptr) { 
     ai[n++] = (int)strtol(ptr, &ptr, 10); 
     if (*ptr) ptr++; 
    } 
    printf("Path:%s", path); 
    for (int i = 0; i < n; i++) { 
     printf(" INT%d=%d", i + 1, ai[i]); 
    } 
    printf("\n"); 
    return 0; 
} 
1

Кажется, что вы хотите использовать что-то вроде strtok()

Вот это example слегка модифицирована:

/* strtok example */ 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    char string[] = "/home/my/estf 122,323 452,323 662,343"; 
    char * pch; 

    pch = strtok (string, " ,"); 
    while (pch != NULL) 
    { 
    pch = strtok (NULL, " ,"); 
    if (pch) 
    { 
     int val = atoi(pch); 
     printf ("%d\n", val); 
    } 
    } 

    return 0; 
} 
Смежные вопросы