所以,我必须做一个词汇表,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
答案 0 :(得分:0)
如果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]);
}
答案 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);
}