我正在尝试编写一个方法:traverseKeyAndValue(text),它将遍历一串多个键值对并打印。即,如果传递“key1:value1,key2:value2,key3:value3”,它将提取键和值。 我已经使用了另一种基于开始和结束文本的子串的方法。 以下是我的代码:
void extractSubstring (char *source, char *dest, char *startingText, char *endingText, bool includeStart) {
size_t sourceLen = strlen(source);
size_t startLen = strlen(startingText);
size_t endingIndex = sourceLen;
source = strstr (source, startingText);
if(!includeStart){
source+=startLen;
}
if(strlen(endingText)>0){
endingIndex = strstr (source, endingText) - source;
strncpy(dest, source, endingIndex);
}
else {
strcpy (dest, source);
}
dest[endingIndex] = '\0';
}
void traverseKeyAndValue(char *inputText){
int i=0;
while(inputText[i]!='\0'){
char key[18];
char value[8];
extractSubstring(inputText,key,"",":",false);
printf(key);
extractSubstring(inputText,value,":",",",false);
printf(value);
size_t keylen = strlen(key);
size_t valuelen= strlen(value);
int total= keylen+valuelen+1;
inputText+=total;
}
}
我有,使用指针inputText,我在每次迭代中递增键+值的长度以指向下一个条目。但这是“没有输出”
答案 0 :(得分:2)
我展示了如何使用strtok
的简单示例。我假设输入来自fgets
(保留任何换行符)。
#include <stdio.h>
#include <string.h>
int main(void)
{
char input[] = "key1:value1,key2:value2,key3:value3\n"; // example input from fgets
char seper[] = " ,:\t\n"; // seperators
char *tok;
tok = strtok(input, seper);
while(tok) {
printf("%-20s", tok);
tok = strtok(NULL, seper);
if(tok) {
printf("%s", tok);
tok = strtok(NULL, seper);
}
printf("\n");
}
}
节目输出:
key1 value1 key2 value2 key3 value3
有比strtok
更好的功能,这些功能不可重入,例如strtok_r
和strtok_s
以及strsep
,具体取决于平台。
可以改进示例来处理缺少的值字段,但这是一个基本的演示。