【问题标题】:Using strtok, last token comes with a line delimiter使用 strtok,最后一个标记带有行分隔符
【发布时间】:2018-11-10 00:49:17
【问题描述】:

那么在编写此代码并显示带有行分隔符“\n”的最后一个标记时,我该如何取出它?

 while( fgets( c, MAX_viagens, f) != NULL ) {
    int i = 0;
    char *p = strtok (c, ":");
    char *array[6];

        while (p != NULL){
         array[i++] = p;
         p = strtok (NULL, ":");
        }
    printf ("%s\n", array[3]);

【问题讨论】:

  • 最好在fgets 之后和strtok 之前去除换行符。喜欢here

标签: c strtok


【解决方案1】:

实现此目的的一种简单方法是将换行符添加到分隔符:

char *p = strtok (c, ":\n");
...
p = strtok (NULL, ":\n");

或者你可以在之前删除它(删除最后一个字符,即使它不是'\n'):

if(c[0])
{
    c[strlen(c)-1] = '\0';
}

【讨论】:

  • 我认为你的第一个例子是要走的路。但是,strlen 有额外的费用,所以,对于你的第二个例子,我会这样做:int len = strlen(c); if (len) c[len - 1] = 0;
  • @CraigEstey 是的,只调用一次strlen 会更有效率。但是,如果您启用优化,我认为编译器应该能够识别它。
  • @CraigEstey 我把它改成了更简单的检查。
  • 我认为这是个好主意。因为这样:#include <string.h> char *c; void funny(char *ptr); int main(void) { for (int idx = 0; idx < strlen(c); ++idx) funny(&c[idx]); return 0; } strlen 优化为单个调用。因为它不能——它必须假设funny 可以更改字符串并且strlen 将返回不同的值。帮助编译器[而不是_依赖它]是一种很好的做法,IMO。
猜你喜欢
  • 2013-05-10
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
相关资源
最近更新 更多