【发布时间】:2015-11-16 04:01:18
【问题描述】:
在将字符串拆分为标记后,有没有办法将这些标记back 转换为原始字符串(带有标点符号和原始大小写敏感)?
我相当肯定会调用 strcat,但是保持原始字符串的标点符号和区分大小写的好方法是什么?
假设我需要单独修改每个标记,然后再将它们连接回原始字符串的结构。
编辑:我希望标题已经改写和澄清。
char* msg = malloc(10000);
char* msg2 = malloc(10000);
char* buffer;
char buffer2[10000];
printf("input: \n");
fgets(msg, 9999, stdin);
msg2 = strdup(msg);
buffer = strtok(msg2, " ;,.!?\n");
Node* ptr; // assume this is initialized to a linked list containing 2 strings per node (str, str2)
while (buffer) {
for (int i = 0; i < strlen(buffer); i++) { //strcmp is case-sensitive
if (isalpha(buffer[i])) {
buffer[i] = tolower(buffer[i]);
}
}
while (ptr) {
if ((ptr != NULL) && (strcmp(ptr->str, ptr->str2) != 0)) {
buffer = ptr->str2; // modifies the token
break;
}
}
ptr = ptr->next;
}
strcat(buffer2, " "); // this will concatenate the modified tokens back together with spaces
strcat(buffer2, buffer); // but I lose the original string's structure (i.e.: punctuation, case-sensitivity)
buffer = strtok(NULL, " ;,.!?\n");
printf("%s", buffer2); // so how should I get the original string's structure back with the modified tokens?
【问题讨论】:
-
嗯...在拆分之前保存一份副本?
-
@KenWhite 我需要单独修改每个令牌,但我认为这对我没有多大好处。另外,我确实保存了一份副本:
char* msg原封不动。 -
问题是,除非你打破单个分隔符上的单词,或者保存每个单词之间的分隔符,否则没有办法重新创建字符串,因为你不知道原来是哪个分隔符.如果您只想写回标记并在其间留一个空格,请参阅
sprintf。 -
@Sleepless,我一定很困惑你在问什么,为什么不
printf("%s", msg);??您正在将每个标记的小写字母与列表的元素进行比较,并将buffer与buffer2连接起来,两者之间有一个空格,然后呢? -
如果您想知道原始标记之间的内容,您将不得不放弃
strtok()——这可能是个好主意——或者查看原始字符串并找出分隔符是什么,等等。我只是不确定为什么您会遇到问题,因为您保留了原始字符串。无论如何,在我看来你应该使用strcspn()而不是strtok();它不会破坏您的字符串,并为您提供字符串的偏移量,这些偏移量同样适用于原始字符串和副本。