在这个程序中,我想读取一个文件并将其转换为字符串并使用空格,\ 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);
}
答案 0 :(得分:2)
while(ch!=EOF)
,因为它有意外行为。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
}
}
}
对此函数的一系列调用将str拆分为标记,标记是由作为分隔符一部分的任何字符分隔的连续字符序列。
在第一次调用时,函数需要一个C字符串作为str的参数,其第一个字符用作扫描标记的起始位置。在后续调用中,函数需要一个空指针,并在最后一个标记结束后立即使用该位置作为扫描的新起始位置。
参考: