【问题标题】:Read file and tokenize by strtok in c在c中通过strtok读取文件并标记化
【发布时间】:2017-12-03 08:35:01
【问题描述】:

在这个程序中,我想读取一个文件并将其转换为字符串并用空格、\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 ,+=");
}
}
}

这是我正在阅读 i.c 的文件

#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);
}

【问题讨论】:

  • 代码有几个错误。未在 strcat(bb,buff); 之前初始化 bb。错误地使用了对strtok 的后续调用(应该是NULL 参数)。使用fgets 循环的错误方式。无需额外的getc。失败后未完成的逻辑fopen
  • 先生,请再看一遍代码。我已经在文件指针下面初始化了 bb 。任何进一步的帮助将不胜感激@Weather Vane
  • 抱歉,bb 没有初始化。 Functionstrcat 需要一个以 nul 结尾的字符串来追加。局部变量不会自动初始化——你必须自己做,比如char bb[500] = "";
  • 看到这一行 int main() { FILE *fp; char ch,buff[500],bb[500];

标签: c file strtok


【解决方案1】:

解决办法:

  • 不应使用while(ch!=EOF),因为它具有意外行为。
  • 使用 fscanf 读取行。使用 ret 整数,如果文件结束,则返回 EOF;如果未将行扫描到变量中,则返回 0
  • 在获取令牌时,您应该传递 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 的参数,其第一个字符用作扫描标记的起始位置。在随后的调用中,该函数需要一个空指针,并使用最后一个标记结束后的位置作为新的扫描起始位置。

参考:

【讨论】:

  • 你为什么用这个 tok=strtok(NULL,"\n ,+=");
  • 检查我在下面添加的参考。
  • 在站点 :: 第一次调用时,该函数需要一个 C 字符串作为 str 的参数,其第一个字符用作扫描标记的起始位置。在随后的调用中,该函数需要一个空指针,并使用最后一个标记结束后的位置作为新的扫描起始位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2010-09-21
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多