【问题标题】:Reading line count with strtok in c在c中使用strtok读取行数
【发布时间】:2020-01-27 21:42:49
【问题描述】:

对于我的程序,我必须给出文件的字数和行数。我知道他们使用 if 语句是一种更简单的方法,但我需要使用 strtock。 它目前给了我一个正确的字数,但我的行数一直是错误的。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int wordcount(char *string);
int linecount(char *string);

int main(){
    char * buffer=0;
    long length;
    char filename[50];

    printf("Enter file name: \n");
    scanf("%s",filename);
    FILE *f= fopen(filename, "rb");

    if(f){
        fseek(f,0,SEEK_END);
        length=ftell(f);
        fseek(f,0,SEEK_SET);
        buffer=malloc(length);
        if (buffer){
            fread(buffer,1,length,f);
        }
        fclose(f);
    }
    if(buffer){
        printf("wordcount: %i\n", wordcount(buffer));
        printf("linecount: %i\n", linecount(buffer));
    }

    return (EXIT_SUCCESS);
}


int wordcount(char *string){
    int count=0;
    for(string=strtok(string," =.!,;\n");string; string=strtok(NULL, " -.!,;\n"))
        count++;
    return count;
}

int linecount(char *string){
    int count=1;
    for(string=strtok(string,"\n");string; string=strtok(NULL, "\n"))
        count++;
    return count;
}

我知道我在我的 strtok 中遗漏了一些不算数的东西,但我不确定它是什么。 非常感谢任何帮助。

【问题讨论】:

  • 如果 buffer from fread(buffer,1,length,f);"abc\nXYZ" ,你会把它算作 1 行还是 2 行?
  • buffer=malloc(length); 应该是 buffer=malloc(length+1); buffer[length]=0; 以便稍后用作 字符串

标签: c


【解决方案1】:

strtok 销毁字符串,它写入空终止符。

如果你想使用strtok,你必须复制一个字符串,并在副本上使用strtok

例如:

int wordcount(const char *string) {
    char *copy = malloc(strlen(string) + 1);
    strcpy(copy, string);
    int count = 0;
    for (copy = strtok(copy, " =.!,;\n"); copy; copy = strtok(NULL, " -.!,;\n"))
        count++;
    free(copy);
    return count;
}

int linecount(const char *string) {
    char *copy = malloc(strlen(string) + 1);
    strcpy(copy, string);
    int count = 0;
    for (copy = strtok(copy, "\n"); copy; copy = strtok(NULL, "\n"))
        count++;
    free(copy);
    return count;
}

【讨论】:

  • 既然您知道main() 中缓冲区的长度,您也可以将长度传递给函数。原始代码最后没有为空字节分配足够的空间。
【解决方案2】:

你不能像这样在同一个字符串上使用 strtok 两次,strtok 会将字符串拆分为多个字符串。
我建议仅在副本上运行 strtok,最好是本地副本。
类似的东西:

int wordcount(char *input){
  char string[strlen(input) + 1];
  int count=0;
  strcpy(string, input);
  for(string=strtok(string," =.!,;\n");string; string=strtok(NULL, " -.!,;\n"))
    count++;
  return count;
}

int linecount(char * input){
  char string[strlen(input) + 1];
  int count=0;
  strcpy(string, input);
  for(string=strtok(string,"\n");string; string=strtok(NULL, "\n"))
    count++;
  return count;
}

【讨论】:

  • 我预计 char string[strlen(input) + 1]; ... string=strtok(string," =.!,;\n"); 会出现编译器错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多