2016-11-01 4 views
-1

Я хочу разделить эту строкуразбить строку и сохранить ее в другой переменной в C

ким-Тэ Ён

и поместить их в различные переменные, как это:

данные [1] = данные "КИМ" [2] = данные "TAE" [3] = "Ы"

, но я разделил строку, не сохраняя их в этой переменной. Как я могу это сделать?

Вот мой код:

char buff[] = "kim-tae-yeon"; 
    int i = 0; 

    char *p = strtok (buff, "-"); 
    char *data[3]; 

    while (p) 
    { 
     data[i++] = p; 
     p = strtok (NULL, "-"); 
    } 

    for (i = 0; i < 3; i++) 
    { 
     printf ("%s\n", &data[i]); 
    } 

    return 0; 
} 
+1

Включите предупреждения, '-Wall', и это покажет вам проблему. Кроме того, вы хотите изменить 'buff'? Потому что теперь это просто «ким». – Schwern

+0

Пожалуйста, откорректируйте свой код правильно. –

ответ

1

Это неправильно:

printf("%s\n", &data[i]); 

%s спецификатор формата требует char* но вы предоставили char ** (указатель на указатель на символ). data[i]является уже char *, поэтому вам нужно:

printf("%s\n", data[i]); 

Если вы обобщил все предупреждения разрешены (-Wall вариант с НКУ) процесс компиляции бы вам об этом сказал.

+0

Я уже поменяю ваше предложение, все еще .. только для печати kim, tae, yeon. когда я хочу данные [1] = kim данные [2] = tae данные [3] = yeon – user6318361

+1

@ user6318361 код работает так, как ожидалось здесь: http://ideone.com/I424xr. Пожалуйста, отредактируйте свой вопрос и сообщите нам, какой результат _exactly_ вы ожидаете. Массивы BTW начинаются с индекса 0, а не 1. –

+0

все, что я хочу, разделяет эту вещь «kim-tae-yeon», и после ее разделения я хочу сохранить ее в этой переменной. переменная - данные [1], данные [2] и данные [3]. – user6318361

2

Ваша программа работает хорошо. Ошибка возникает из-за того, что вы переходите к printf&data[i], но data - это массив указателей (char *[]), что означает, что каждый элемент массива является указателем (char *). Вы хотите перейти к printf a string, data[i].

Это выход вы хотите:

for (i = 0; i < 3; i++) 
{ 
    printf("data[%i] = %s\n", i+1, data[i]); 
} 

Как в комментарии было сказано, нет data[3].
Массив начинается data[0], это по умолчанию C.
Вы все еще можете иметь выход

data[1] = kim 
data[2] = tae 
data[3] = yaeon 

путем добавления 1 к i, , но этот вывод не представляет фактическую data массив.

+0

Я уже поменяю ваше предложение, все еще .. только его печать kim, tae, yeon. когда я хочу данные [1] = kim данные [2] = tae данные [3] = yeon – user6318361

+0

Вы хотите напечатать: данные [1] = данные kim [2] = данные tae [3] = Ён? – LotoLo

+0

@ user6318361 Пожалуйста, дайте нам знать, что __exactly__ вы ожидаете, что ваша программа будет печататься. –

0

Если вы готовы ограничить длину подстроки, это может быть решена намного проще и менее страшно (strtok() страшно, давай!), Используя обычный старый sscanf():

const char buff[] = "kim-tae-yeon"; 
char data[3][32]; 

if (sscanf(buff, "%31[^-]-%31[^-]-%31[^-]", data[0], data[1], data[2]) == 3) 
{ 
    printf("parts are '%s', '%s' and '%s'\n", data[0], data[1], data[2]); 
} 

спецификатор формата , который повторяется три раза с дефисами между ними, равен %31[^-], это означает «собрать не более 31 символов без штриха». 31 гарантирует, что в наших 32-символьных буферах есть место для завершения.

Это немного не DRY с размером буфера, повторяющимся в строке формата, самым простым решением для этого является создание строки формата во время выполнения с использованием snprintf(), но это заслоняет проблему, поэтому я не делал этого ,

0

Что-то вроде этого может работать. Вместо этого он использует strcpy для копирования поверх строки, на которую указывает, в данном случае buffer, на место в data[i].

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

#define STRSIZE 50 
#define NUMWORDS 3 

int 
main(void) { 
    char buff[] = "kim-tae-yeon"; 
    char data[NUMWORDS][STRSIZE]; 
    char *buffer; 
    int i; 

    buffer = strtok(buff, "-"); 

    i = 0; 
    while (buffer != NULL) { 
     strcpy(data[i], buffer); 

     printf("data[%i] = %s\n", i+1, data[i]); 

     buffer = strtok(NULL, "-"); 

     i++; 
    } 

    return 0; 
}