意外标记附近的语法错误';(';在C中)
我收到一条令人困惑的错误消息。我正在Windows XP 32位上运行MinGW。当我尝试编译以下代码时,我收到一条错误消息“/hello.c:第4行:意外标记“(””附近的语法错误。第4行位于int main(…),我无法确定意外标记是“near”(”。我尝试使用int main(void),但我得到了相同的消息。但是,如果我编译它时没有“char string…”和“data=fputs(…)”,并且从给定的文本文件中读取它,那么它编译时不会出现问题 我试图完成的是从一个文件中读取文件名,该文件名由外部源(即php)提供。最终,我将使用我所做的解析器将其转换为Apache模块,因此调用php,但我想在开始这一部分之前先构建一些模板代码意外标记附近的语法错误';(';在C中),c,file-io,syntax-error,fputs,C,File Io,Syntax Error,Fputs,我收到一条令人困惑的错误消息。我正在Windows XP 32位上运行MinGW。当我尝试编译以下代码时,我收到一条错误消息“/hello.c:第4行:意外标记“(””附近的语法错误。第4行位于int main(…),我无法确定意外标记是“near”(”。我尝试使用int main(void),但我得到了相同的消息。但是,如果我编译它时没有“char string…”和“data=fputs(…)”,并且从给定的文本文件中读取它,那么它编译时不会出现问题 我试图完成的是从一个文件中读取文件名,该
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
FILE *fp;
//char string = "JD"; commented out
char data;
//printf("Type in your filename: "); also commented out
//scanf("%s", &argv); also commented out
if(argc >= 2)
{
fp = fopen("sample.txt", "r"); //switched to reading a given file
}
while((data = getchar()) != EOF)
{
fgets(data, sizeof(data), fp);
// data = fputs(string, fp);
}
if (fp==NULL) /* error opening file returns NULL */
{
printf("Could not open player file!\n"); /* error message */
return 1; /* exit with failure */
}
/* while we're not at end of file */
while (fgets(data, sizeof(string), fp) != NULL)
{
printf(data); /* print the string */
}
fclose(fp); /* close the file */
return 0; /* success */
}
#包括
#包括
内部主(空)
{
文件*fp;
//char string=“JD”已注释掉
字符数据;
//printf(“输入文件名:”);也被注释掉了
//scanf(“%s”和&argv);也已注释掉
如果(argc>=2)
{
fp=fopen(“sample.txt”,“r”);//切换到读取给定文件
}
而((data=getchar())!=EOF)
{
fgets(数据、sizeof(数据)、fp);
//数据=fputs(字符串,fp);
}
如果(fp==NULL)/*打开文件时出错,则返回NULL*/
{
printf(“无法打开播放器文件!\n”);/*错误消息*/
返回1;/*失败退出*/
}
/*虽然我们还没到文件的末尾*/
while(fgets(数据,sizeof(字符串),fp)!=NULL)
{
printf(数据);/*打印字符串*/
}
fclose(fp);/*关闭文件*/
返回0;/*成功*/
}
好吧,我试着写一个简单的“Hello World”程序,但是我仍然得到了相同的错误消息,这让我觉得错误消息根本不是由我的代码引起的
#include <stdio.h>
int main(void) //still getting a syntax error before unexpected token '('
{
printf("Hello, world!");
return 0;
}
#包括
int main(void)//在意外标记“(”之前仍存在语法错误
{
printf(“你好,世界!”);
返回0;
}
您的线路
int main (int argc, char *argv)
是错的,一定是
int main (int argc, char *argv[])
或
还有你的线路
char string = "JD";
应该是
const char *string = "JD";
还有,我不明白
scanf("%s", &argv);
你为什么要把一些东西读入argv
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1024 // a normal buffer size for fgets
int main (int argc, char *argv[])
{
FILE *fp;
//char string = "JD";
//char data;
char buffer[MAXLINE];
if(argc != 2)
{printf("usage : ./a.out <filename>\n"); return -1;}
if((fp = fopen(argv[1],"r+")) == NULL)
{printf("open file %s error\n",argv[1]); return -1;}
/*
while((data = getchar()) != EOF)
{
fgets(data, sizeof(data), fp);
data = fputs(string, fp);
}*/ //I don't understand this part .
/* while we're not at end of file */
while (fgets(buffer,MAXLINE , fp) != NULL)
{
printf("%s\n",buffer); /* print the string */
}
fclose(fp); /* close the file */
return 0; /* success */
}
#包括
#定义MAXLINE 1024//FGET的正常缓冲区大小
int main(int argc,char*argv[])
{
文件*fp;
//char string=“JD”;
//字符数据;
字符缓冲区[MAXLINE];
如果(argc!=2)
{printf(“用法:./a.out\n”);返回-1;}
如果((fp=fopen(argv[1],“r+”)==NULL)
{printf(“打开文件%s错误\n”,argv[1]);返回-1;}
/*
而((data=getchar())!=EOF)
{
fgets(数据、sizeof(数据)、fp);
数据=fputs(字符串,fp);
}*///我不明白这部分。
/*虽然我们还没到文件的末尾*/
while(fgets(缓冲区、MAXLINE、fp)!=NULL)
{
printf(“%s\n”,buffer);/*打印字符串*/
}
fclose(fp);/*关闭文件*/
返回0;/*成功*/
}
在让我的计算机休息一段时间后,我尝试在没有
fgets()函数的情况下重新编译不同的源代码,并且它们编译正确。我猜fgets()函数正如alk所指出的,函数是由于函数引发的未定义行为而导致语法错误的原因,因为任何没有函数的代码现在编译时都不会出错,所以我考虑回答这个问题。问题显然是哈希(#)之后和include之前缺少空间。
在我添加空间后,它就像一个符咒
(我知道这条线索有点旧,但谷歌把我带到这里来是因为我也有同样的问题,并试图找出问题所在,所以这可能会帮助其他人。)我更喜欢main
的第三个选项。它明确地说明了argv
是什么,而第二个选项试图通过使它看起来像一个数组来隐藏它。@bash.d我已将它编辑为int main(int argc,char**argv)
,以及const char*string=“JD”
。我正在将文件名读入argv
。那么,您仍然会收到错误吗?argv
不是用来读入值的…是的,我仍然会收到错误。我尝试切换到scanf(“%s”)和&filename)
,声明filename[]
首先,但仍然会出现错误。您仍然没有更新到int main(int argc,char**argv)
这个fgets(data,sizeof(string),fp)
会引发未感染的行为,因为它读取了无效的地址,即数据的值
。奇怪的是,当我使用fp=fopen(“sample.txt”,“r”)时,这种行为起了作用
。但现在,由于某些原因,这已经不起作用了。您使用的是什么命令行进行编译?您的编译器编译的正确吗?您是否尝试了其他编译器(如DMC)?似乎问题出在您的编译器中。@Josh:您已经学会了“未定义行为”的导入方面:任何事情都可能发生!:-)请引用准确的错误消息,包括文件名和行号。尝试了您的建议,但仍然给我相同的错误消息。
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1024 // a normal buffer size for fgets
int main (int argc, char *argv[])
{
FILE *fp;
//char string = "JD";
//char data;
char buffer[MAXLINE];
if(argc != 2)
{printf("usage : ./a.out <filename>\n"); return -1;}
if((fp = fopen(argv[1],"r+")) == NULL)
{printf("open file %s error\n",argv[1]); return -1;}
/*
while((data = getchar()) != EOF)
{
fgets(data, sizeof(data), fp);
data = fputs(string, fp);
}*/ //I don't understand this part .
/* while we're not at end of file */
while (fgets(buffer,MAXLINE , fp) != NULL)
{
printf("%s\n",buffer); /* print the string */
}
fclose(fp); /* close the file */
return 0; /* success */
}