我需要将字符串分成3个大小不同的部分

时间:2019-07-05 12:49:58

标签: c arrays pointers string.h

所以,我必须做一个词汇表,scanf总是会读取一个字符和一些文本,第一个字符是我需要做的动作,例如擦除某些东西,包含或打印。另一部分是我要添加或删除的词,其余的就是含义。 有时,我只会收到char来执行操作,例如“全部打印”,或者我可以收到诸如“ e word含义”之类的内容以删除含义,但是我也可以接收“ e word”并消除相关的单词和含义,因此条目的大小并不总是相同。 进入案例是:

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);
}

动作:a 字:bbbbbbbbbb 含义:cccc ccccccccccc cccc

2 个答案:

答案 0 :(得分:0)

如果abbbbbbbbbb不包含空格,请致电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]);
}

答案 1 :(得分:0)

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);
}