2014-01-02 4 views
1

У меня есть строка, которая включает в себя два имени и запятую, как я могу их разделить и написать их для разделения строк.
ПримерРазделение строк в C

char *line="John Smith,Jane Smith";  

Я имею в виду использование sscanf функции.

sscanf(line,"%s,%s",str1,str2);  

Что мне делать?
примечание: я могу изменить запятую на символ пробела.

+2

Вы можете дать этому вид: http://stackoverflow.com/questions/9210528/split-string-with-delimiters -in-c – Raptor

+1

Strtok() http://www.cplusplus.com/reference/cstring/strtok/ –

+0

@JoeDF Если это семейство, то 'strtok_r()' (это по своей сути небезопасно). –

ответ

8

Я думаю об использовании функции sscanf.

Даже не думайте об этом.

char line[] = "John Smith,Jane Smith"; 
char *comma = strchr(line, ','); 
*comma = 0; 
char *firstName = line; 
char *secondName = comma + 1; 
+1

На самом деле существует целое число между именами => «Джон Смит, 10, Джейн Смит». Я мог бы управлять этим, если бы понял, как это сделать только с двумя строками. Но ваш ответ немного сложный для меня (я абсолютный новичок). Не возражаете ли вы хотя бы немного объяснить это мне? – ossobuko

+2

@OssoBuko Да. Вы ищите позицию запятой с помощью 'strchr()', а затем перезаписываете ее с помощью 0, которая завершает первую строку. Тогда у вас есть первая строка. Затем вы знаете, что вторая строка начинается сразу после запятой, поэтому вы берете указатель на символ после нее ('comma + 1'), и там вы идете, у вас тоже есть вторая строка. –

+0

@OssoBuko; Это очень простой ответ, если у вас есть представление о ['strchr'] (http://www.tutorialspoint.com/ansi_c/c_strchr.htm). – haccks

-1

Вот как вы могли бы сделать это с помощью strtok:

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

int main() 
{ 
    // Your string. 
    char *line = "John Smith,10,Jane Smith"; 

    // Let's work with a copy of your string. 
    char *line_copy = malloc(1 + strlen(line)); 
    strcpy(line_copy, line); 

    // Get the first person. 
    char *pointer = strtok(line_copy, ",");  
    char *first = malloc(1 + strlen(pointer)); 
    strcpy(first, pointer); 

    // Skip the number. 
    strtok(NULL, ","); 

    // Get the second person. 
    pointer = strtok(NULL, ",");  
    char *second = malloc(1 + strlen(pointer)); 
    strcpy(second, pointer); 

    // Print. 
    printf("%s\n%s", first, second); 

    return 0; 
} 
+3

** Это неправильно ** на так много уровней. Во-первых, есть ненужная копия. Вы могли бы просто объявить 'line' как массив. Во-вторых, для 'line_copy' не выделяется память, поэтому' strcpy() 'ing на нее приводит к неопределенному поведению (что означает, что это может привести к сбою или, что еще хуже, оно может терпеть неудачу тихо, вызывая проблемы с большим, трудно обнаружимым в другом месте.) Кроме того, лучше использовать 'strtok_r()' вместо 'strtok()', потому что последнее по своей сути является небезопасным. –

+0

Хорошо, мой код не подходит для использования в промышленности. Я внес некоторые изменения в это. Но когда Osso пишет многопоточную программу, я буду использовать 'strtok_r'; он сказал, что он * абсолютный новичок *. – Raptor

+2

@ JosuéMolina Вот почему опасно писать для него неправильный код. –

Смежные вопросы