gpt4 book ai didi

c - 在 c 中通过 strtok 读取文件并标记化

转载 作者:太空宇宙 更新时间:2023-11-04 02:28:17 24 4
gpt4 key购买 nike

在这个程序中,我想读取一个文件并将其转换为字符串并用空格、\n、逗号和 + 标记它们,但我得到了第一行的无限执行

#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
char ch,buff[500],bb[500];
int i=0;
fp=fopen("i.c","r");
if(fp==NULL) printf("File not opened");
else{
printf("File opened successfully\n");
ch=getc(fp);
while(ch!=EOF){
fgets(buff,500,fp);
strcat(bb,buff);
ch=getc(fp);
}
char *tok=strtok(bb,"\n ,+=");
while(tok!=NULL){
printf("%s",tok);
tok=strtok(bb,"\n ,+=");
}
}
}

这是我正在阅读的文件 ic

#include<stdio.h>
#include<stdlib.h>
int main()
{
int num1=5,num2=6,num3;
char str[10]="hello";
num3=num1+num2;
printf("%s:%d",str,num3);
}

最佳答案

解决方案:

  • 不应使用 while(ch!=EOF),因为它有意外行为。
  • 使用 fscanf 读取行。使用 ret 整数,如果文件结束将返回 EOF,如果行未扫描到变量中则返回 0
  • 在获取 token 时,您应该传递 NULL 而不是指针。 tok=strtok(NULL,"\n ,+="); 而不是 tok=strtok(bb,"\n ,+=");代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int main()
    {
    FILE *fp;
    char ch,line[500],bb[1000] = ""; // initialize bb
    int i=0,ret;
    fp=fopen("i.c","r");
    if(fp==NULL) printf("File not opened");
    else
    {
    printf("File opened successfully\n");
    while(ret = fscanf(fp," %s ", line)) // use of fscanf
    {
    if(ret == EOF)
    {
    break;
    }

    strcat(bb,line);
    strcat(bb,"\n");
    }

    char *tok=strtok(bb,"\n ,+=");
    while(tok!=NULL)
    {
    printf("%s",tok);
    tok=strtok(NULL,"\n ,+="); // NULL instead of pointer
    }
    }
    }

    strtok in c:

  • 对该函数的一系列调用将 str 拆分为标记,这些标记是由作为定界符一部分的任何字符分隔的连续字符序列。

  • 在第一次调用时,该函数需要一个 C 字符串作为 str 的参数,其第一个字符用作扫描标记的起始位置。在后续调用中,该函数需要一个空指针,并使用最后一个标记结束后的位置作为扫描的新起始位置。

引用:

关于c - 在 c 中通过 strtok 读取文件并标记化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47616689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com