【问题标题】:How do I tokenize a string only using <iostream>?如何仅使用 <iostream> 标记字符串?
【发布时间】:2019-09-08 17:31:24
【问题描述】:

我想学习如何标记字符串,例如仅使用 &lt;iostream&gt; 的 strtok 函数。

我制作了一个删除空格的程序,但我认为它与 strtok 不同。

#include <iostream>
int main(){
   int i = 0;
   char s[100]="fix the car";
   while(s[i] != '\0'){
       if(s[i] == ' ')
            s[i] = s[i-1];
                else std::cout << s[i];

    i++;
    }
   return 0;
}

prints: fixthecar

我想要整个strtok函数,不只是删除分隔符,听说要用指针,但不知道怎么写代码。

【问题讨论】:

  • 你认为“s[i] == s[i-1];”是做什么的,这行代码的目的是什么?
  • 应该是 =,我的错。应该去掉这个例子中的空间。或者如果 (s[i] == 'a') 它应该删除文本中的所有 a。
  • 只使用 就很棘手。添加 你有很多字符串解析的机会。如果您希望自己编写strtok,它是如何工作的is described here
  • 我知道这很棘手,但为此我只想使用 iostream。
  • 如果字符串的第一个字符是空格怎么办,所以这就变成了s[0]=s[-1],由于s[-1]不存在,当然这变成了未定义的行为。

标签: c++ iostream strtok


【解决方案1】:

strtok 的内部实现已经在这里讨论过了,你应该在打开新问题之前检查一下。

strtok() 操作的关键是在连续调用之间保留最后一个分隔符的位置(这就是为什么strtok() 在使用null pointer 调用它时继续解析传递给它的原始字符串的原因在连续通话中)..

看看这个strtok() 实现,它的功能与strtok() 提供的功能略有不同

char *zStrtok(char *str, const char *delim) {
    static char *static_str=0;      /* var to store last address */
    int index=0, strlength=0;           /* integers for indexes */
    int found = 0;                  /* check if delim is found */

   /* delimiter cannot be NULL
   * if no more char left, return NULL as well
   */
   if (delim==0 || (str == 0 && static_str == 0))
       return 0;

   if (str == 0)
       str = static_str;

   /* get length of string */
   while(str[strlength])
       strlength++;

   /* find the first occurance of delim */
   for (index=0;index<strlength;index++)
       if (str[index]==delim[0]) {
           found=1;
           break;
       }

   /* if delim is not contained in str, return str */
   if (!found) {
       static_str = 0;
       return str;
   }

   /* check for consecutive delimiters
   *if first char is delim, return delim
   */
   if (str[0]==delim[0]) {
       static_str = (str + 1);
       return (char *)delim;
   }

   /* terminate the string
   * this assignmetn requires char[], so str has to
   * be char[] rather than *char
   */
   str[index] = '\0';

   /* save the rest of the string */
   if ((str + index + 1)!=0)
       static_str = (str + index + 1);
   else
       static_str = 0;

       return str;
}

【讨论】:

  • OP 只想使用&lt;iostream&gt;。我没有看到您的答案中在哪里使用了 &lt;iostream&gt; 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多