【问题标题】:Saving a string until a last delimiter is found - C保存字符串直到找到最后一个分隔符 - C
【发布时间】:2017-01-04 19:13:38
【问题描述】:

是否可以使用 strtok 或其他字符串函数来剪切字符串,直到找到最后一个分隔符。

具体的例子是日期;我想转换“4.1.2017”。到“4.1.2017” - 最后没有点。

【问题讨论】:

  • 作为评论,值得注意的是strtok 已被strsep 淘汰,但如果您要使用strtok,则值得使用strtok_r,因为它是线程安全且可重入的。
  • 我的问题是:为什么要使用复杂的函数来删除末尾的点?您能否详细说明该任务中可能出现的复杂情况?
  • 这是一个涉及文件处理、字符串操作和结构主题的作业。我们需要扫描文件中的数据,对其进行操作,然后将其打印到单独的文件中。我同意这很愚蠢,但我们必须将代码上传到评估它的服务器上,并且必须以这种格式编写。
  • 只需创建一个函数,该函数遍历整个缓冲区直到结束,然后为找到的每个分隔符将其(其位置)保存到一个变量中,然后移动到找到的下一个字符,直到(也许)你得到另一个分隔符。将其位置保存到该变量并返回带有该变量的函数。如果您知道分隔符的位置,休息很容易。

标签: c string strtok


【解决方案1】:

如果您只有一个分隔符,请使用strrchr 查找它在字符串中的最后一次出现:

char str[] = "quick.brown.fox";
char *ptr = strrchr(str, '.');
if (ptr) {
    *ptr = '\0';
}
printf("%s\n"' str);

这个produces the following output

quick.brown

【讨论】:

    【解决方案2】:

    就像我在我的评论中解释的那样(如果您不想使用 strrchr 或者由于某些原因不能使用),我将创建一个函数来检查该分隔符的位置,如下所示:

    int my_strrchr(const char *ptr, const char delimiter){
        if (ptr == NULL ){
            printf("Error, NULL Pointer\n");
            return -1;
        }
    
        if ( *ptr == '\0' ){
            printf("Error, the Buffer is Empty\n");
            return 0;
        }
    
        int i = 0;
        int ret = 0;
    
        while( ptr[i] != '\0' ){
            if ( ptr[i] == delimiter ){
                ret = i;
            }
            i++;
        }
    
        return ret;
    }
    

    并像这样使用它:

    #include <stdio.h>
    
    int main(void){
        char arr[] = "4.1.2017.";
        char delimiter = '.';
    
        int len;
    
        if( (len = my_strrchr(arr, delimiter)) > 0){
            while ( arr[len] != '\0'){
                arr[len] = '\0';
            }
            printf("%s\n", arr);
        }
    }
    

    DEMO。 无论如何,这只是为了给你一个想法,正如你所见,我在这里没有使用标准函数。

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      相关资源
      最近更新 更多