2016-09-22 5 views
-4

hi У меня есть этот код на языке C: это разделение строки на токены, но то, что я хочу, это то, что токены получают хранилище в разных переменных например: а [] = + 5000 б [] = - 9000 с [] = 7HH4 d [] = 0, потому что после последней запятой я хочу, что пространство для переменнойКак я могу разделить строку на токены и хранить токены в разных переменных, язык C

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

int main() 
{ 
char str[] = "+5000,-9000,7jj4,"; 

// Returns first token 
char *token = strtok(str, ","); 

// Keep printing tokens while one of the 
// delimiters present in str[]. 
while (token != NULL) 
{ 
    printf("%s\n", token); 
    token = strtok(NULL, "-"); 
} 

return 0; 
} 
+1

Вы можете использовать 'strcpy()' токен в любом достаточно большом массиве, или вы можете его дублировать ('strdup()', если он у вас есть; 'malloc()' + 'strcpy()', если вы не нужно), если вам нужно выделить пространство для него динамически. Вы также можете сохранить указатель на токен, если хотите сохранить исходную строку без изменений. Если это не ответит на вопрос, тогда вам нужно будет уточнить, в чем вопрос. –

+0

Об изменениях в вопросе: 'strtok' не создает' '' 'как токен. – BLUEPIXY

ответ

0

Хорошо, что самое интересное в использовании катящихся колес, C - все о создании чего-то нового. Вот код -

int main (void){ 

char str[] = "+5000, -9000, 7jj4"; 
char *p_str = str; 
char a[10], b[10], c[10]; 
size_t a_count = 0,b_count = 0,c_count = 0;  // Need new index ever time for new token strings 
size_t index = 0; 

    while(*p_str){ 
     if(*p_str == ',') { 
     p_str++; index++; p_str++;  // you can ignore p_str++ here. 
     }  
     if(index == 0 && *p_str != ','){ 
      a[a_count++] = *p_str;   
     } else if(index == 1 && *p_str != ','){ 
      b[b_count++] = *p_str; 
     } else if (index == 2 && *p_str != '\0'){ 
      c[c_count++] = *p_str; 
     }  
     p_str++; 
    } 
    a[a_count] = b[b_count] = c[c_count] = '\0'; 
    printf("A : "); puts(a); 
    printf("B : "); puts(b); 
    printf("C : "); puts(c); 
return 0; 
} 

Примечание: Вы также можете выполнить динамическое распределение.

1

Просто уследить, как много раз вы звонили strtok и копировали строку в соответствующее место каждый раз.

char a[50], b[50], c[50]; 
int count = 0; 

char *token = strtok(str, ","); 

// Keep printing tokens while one of the 
// delimiters present in str[]. 
while (token != NULL) 
{ 
    printf("%s\n", token); 
    count++; 
    switch (count) { 
    case 1: 
     strcpy(a, token); 
     break; 
    case 2: 
     strcpy(b, token); 
     break; 
    case 3: 
     strcpy(c, token); 
     break; 
    } 
    token = strtok(NULL, "-"); 
}  
-1

Вам нужно будет выделить буфер для каждого возвращаемого маркера и сохранить его.

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

int main() 
{ 
char str[] = "+5000,-9000,7jj4"; 

// We'll use this to allocate pointers. 
// 
char **tokens = NULL; 
int totalTokens = 0; 

// Returns first token 
char *token = strtok(str, ","); 

// Keep printing tokens while one of the 
// delimiters present in str[]. 
while (token != NULL) 
{ 
    printf("%s\n", token); 
    token = strtok(NULL, "-"); 

    // Allocate first/next pointer 
    // 
    if (! tokens) { 
     tokens = malloc(sizeof(char *)); 
     if (! tokens) { 
      // Handle malloc() error... 
      // 
     } 
    } else { 
     // Allocate next pointer 
     // 
     tokens = realloc(tokens, (sizeof(char *) * totalTokens); 
     if (! tokens) { 
      // Handle realloc() error. 
      // 
     } 
    } 

    // Use the newly allocates pointer to malloc() a buffer 
    // 
    tokens[totalTokens] = malloc(sizeof(char) * (strlen(token) + 1)); 

    if (! tokens[totalTokens]) { 
     // Handle malloc() error. 
     // 
    } 

    // Store token and next 
    // 
    strcpy(tokens[totalTokens++], token); 
} 

return 0; 
} 

Надеюсь, мы должны помочь.

+0

Я не DV, но ваш код, похоже, не обрабатывает случай пустых строк, который OP хочет сохранить (например, 'a, b ,, c' должен давать другой результат в' a, b, c') –

+0

Это не подходит для ваших ожиданий до того, как вопрос будет изменен. – BLUEPIXY

0

Вы можете просто назначить каждую переменную от strtok.

char *a, *b, *c; 

a = strtok(str, ","); 
b = strtok(NULL, ","); 
c = strtok(NULL, ",");