【问题标题】:Converting modified strtok tokens back into the original string's "syntax"将修改后的 strtok 标记转换回原始字符串的“语法”
【发布时间】: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);??您正在将每个标记的小写字母与列表的元素进行比较,并将 bufferbuffer2 连接起来,两者之间有一个空格,然后呢?
  • 如果您想知道原始标记之间的内容,您将不得不放弃strtok()——这可能是个好主意——或者查看原始字符串并找出分隔符是什么,等等。我只是不确定为什么您会遇到问题,因为您保留了原始字符串。无论如何,在我看来你应该使用strcspn() 而不是strtok();它不会破坏您的字符串,并为您提供字符串的偏移量,这些偏移量同样适用于原始字符串和副本。

标签: c string strtok


【解决方案1】:

如果您想使用strtok(),并且想稍后访问原始字符串,请保留原始字符串的副本,因为 strtok() 会破坏原始字符串。

// we have char *st ;

char *tem = malloc(strlen(st)+1);
strcpy(tem, st);

现在您可以稍后将 tem 作为原始字符串访问。

【讨论】:

  • 答案和评论之间只有一条很细的线。你是最终的法官,但你总是想问“我是直接回答所提出的问题,还是提供变通办法?”没有造成伤害,但我会得出相反的结论。
  • 对不起。所以你的意思是我应该直接回答这个问题?
  • 不,我的意思是你发布的内容是否是作为评论是否会更好的实际答案,这是一个近距离的电话。如果您发布的内容可以成为评论并且不是问题的直接解决方案,那么作为评论可能会更好。就像我说的,没有伤害,只是要注意区别。
  • sizeof 在这里是错误的。此代码将为整数分配空间,然后将字符串复制到该空间中。
  • 你没有意识到sizeof(strlen..)(和sizeof(strlen..+1)sizeof(strlen(..)+10000)等等)总是回馈sizeof(size_t)
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2017-06-15
相关资源
最近更新 更多