Мне нужно разделить строку на 3 части с разными размерами - PullRequest
0 голосов
/ 05 июля 2019

Итак, я должен сделать Глоссарий, scanf всегда будет читать один символ и некоторый текст, первый символ - это действие, которое мне нужно сделать, например стереть что-то, включить или напечатать.Другая часть - это слово, которое я добавлю или уберу, а все остальное - это значение.Иногда я получаю только символ для действия, например, «напечатать все», или я могу получить что-то вроде «значение слова», чтобы удалить значение, но я также могу получить «слово» и уменьшить значение слова и значение, связанное с ним., поэтому запись не всегда одинакового размера.Входные случаи:

i word meaning
q word
e word
e word meaning
p

со значением "означающее", потому что строка имеет вид "имеет красный цвет"

Я пытался использовать strtok и strcat, чтобы собрать их вместе для значения, нобезуспешно, этот код, который я оставил здесь, просто пример, я знаю, что он не работает

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

int main(void){
    char str[] = "a bbbbbbbbbb cccc ccccccccccc cccc"; 
    char* temp; 
    char* rest = str; 
    int i = 0;

    char op[2];

    while ((temp = strtok_r(rest, " ", &rest))){
        printf("%s ", temp);
        if (i>=2){
            strcat(op[2],temp);
        }
        op[i]=temp;
        i++;
    }

    return(0);
}

действие: слово: bbbbbbbbbb значение: cccc ccccccccccc cccc

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

sscanf может использоваться для извлечения трех подстрок.Используйте спецификатор %n, чтобы получить количество символов, обработанных при сканировании первых двух элементов.Затем скопируйте последнюю подстроку, если она существует.

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

int main(void){
    char str[] = "a bbbbbbbbbb cccc ccccccccccc cccc";
    int result = 0;
    int used = 0;

    char op[10] = "";
    char word[50] = "";
    char meaning[500] = "";

    result = sscanf ( str, "%9s%49s %n", op, word, &used);
    if ( result < 2) {
        fprintf ( stderr, "formatting problem\n");
        return 0;
    }
    printf ( "op: %s\n", op);
    printf ( "word: %s\n", word);
    if ( used < strlen ( str)) {
        strncpy ( meaning, &str[used], sizeof meaning);
        printf ( "meaning: %s\n", meaning);
    }

    return(0);
}
0 голосов
/ 05 июля 2019

Если a и bbbbbbbbbb не содержат пробелов, вызовите strtok() 3 раза:

char str[] = "a bbbbbbbbbb cccc ccccccccccc cccc"; 
char *op[3];  // Changed to char * and increased size

// Note: the last call to strok changes the delimiter
if (NULL != (op[0] = strtok(str, " "))) {
    if (NULL != (op[1] = strtok(NULL, " "))) {
        if (NULL != (op[2] = strtok(NULL, ""))) {
            printf("%s / %s / %s\n", op[0], op[1], op[2]);
        }
   }
}

выход

a / bbbbbbbbbb / cccc ccccccccccc cccc

Или, если вы предпочитаете все в одной строке:

if ((op[0] = strtok(str, " ")) && (op[1] = strtok(NULL, " ")) && (op[2] = strtok(NULL, ""))) {
    printf("%s / %s / %s\n", op[0], op[1], op[2]);
}
...