- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法显示它不断循环的输出,我是这方面的初学者。它应该检查输入是字母还是数字并将其存储为标识符,如果运算符将存储为符号并检查输入的关键字。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void keyword(char str[10])
{
if(strcmp("for",str)==0||strcmp("while",str)==0||strcmp("do",str)==0||strcmp("int",str)==0||strcmp("float",str)==0||strcmp("char",str)==0||strcmp("double",str)==0||strcmp("static",str)==0||strcmp("switch",str)==0||strcmp("case",str)==0)
printf("\n%s is a keyword",str);
else
printf("\n%s is an identifier",str);
}
main()
{
FILE *f1,*f2,*f3;
char c,str[10],st1[10];
int num[100], lineo=0,tokenvalue=0,i=0,j=0,k=0;
printf("\nEnter the c program ");
gets(st1);
f1=fopen("input","w");
while((c=getchar())!=EOF)
putc(c,f1);
fclose(f1);
f1=fopen("input","r");
f2=fopen("identifier","w");
f3=fopen("specialchar","w");
while((c=getc(f1))!=EOF)
{
if(isdigit(c))
{
tokenvalue=c-'0';
c=getc(f1);
while(isdigit(c))
{
tokenvalue*=10+c-'0';
c=getc(f1);
}
num[i++]=tokenvalue;
ungetc(c,f1);
}
else if(isalpha(c))
{
putc(c,f2);
c=getc(f1);
while(isdigit(c)||isalpha(c)||c=='_'||c=='$')
{
putc(c,f2);
c=getc(f1);
}
putc(c,f2);
ungetc(c,f1);
}
else if(c==' '||c=='\t')
printf("");
else if(c=='\n')
lineo++;
else
putc(c,f3);
}
fclose(f2);
fclose(f3);
fclose(f1);
printf("\nThe no. im the program are");
for(j=0;j<i;j++)
printf("%d",num[j]);
printf("\n");
f2=fopen("identifier","r");
k=0;
printf("The keywords and identifiers are: ");
while((c=getc(f2))!=EOF)
{
if(c!='\0')
str[k++]=c;
else
{
str[k]='\0';
keyword(str);
k=0;
}
}
fclose(f2);
f3=fopen("specialchar","r");
printf("\nSpecial Characters are: ");
while((c=getc(f3))!=EOF)
printf("%c",c);
printf("\n");
fclose(f3);
printf("Total no. of lines are:%d",lineo);
}
最佳答案
整个代码中有很多微妙的语法误用等。我试图找出所有问题并在评论中注明问题的性质。
从整体角度来看,最大的缺点是没有验证您的文件操作。您必须验证 fopen
是否成功, --- 在尝试从中读取字符之前。对文件进行写入之后的fclose
也是如此,以确保关闭器上不存在流错误,从而使字符未写入文件。 (如果您只是从文件中读取,则通常不需要关闭时进行验证。)
当声明字符数组来保存字符串时,您应该使用 0
初始化所有元素(使用 nul-termination 字符有效地填充数组,以确保您的字符串始终为 < em>nul-termerated只要你不写超出数组的末尾即可。它很简单而且简短。就像 char str[10] = "", st1[10] = 一样简单"";
就是您所需要的。(按照惯例,如果您用值填充数组或结构的第一个元素,则默认情况下所有其他元素都会初始化为零
。)
还有其他微妙之处。您可以在整个过程中混合使用 getc
和 fgetc
。虽然这可以正常工作,但请注意 getc
通常作为宏实现,并且不能保证 fgetc
所做的单遍操作。
这就是概述,浏览代码,然后打开代码。您可能认为所有内容都挤在一起是可读的,但如果您考虑一下代码块之间的空行,就像书写段落一样,它肯定会使流程更容易理解。
将它们放在一起,您可以执行以下操作:
<小时/>注意:根据您的评论进行编辑,更正了最初 Unresolved 读取逻辑错误。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/* use constants, not 'magic numbers' in code */
enum { MAXC = 10, MAXND = 100, MAXFN = 4096 };
void keyword (char *str)
{
if (strncmp ("for", str, strlen ("for")) == 0 ||
strncmp ("while", str, strlen ("while")) == 0 ||
strncmp ("do", str, strlen ("do")) == 0 ||
strncmp ("int", str, strlen ("int")) == 0 ||
strncmp ("float", str, strlen ("float")) == 0 ||
strncmp ("char", str, strlen ("char")) == 0 ||
strncmp ("double", str, strlen ("double")) == 0 ||
strncmp ("static", str, strlen ("static")) == 0 ||
strncmp ("switch", str, strlen ("switch")) == 0 ||
strncmp ("case", str, strlen ("case")) == 0)
printf (" keyword : %s\n", str);
else
printf (" identifier : %s\n", str);
}
int main (void) /* main() is type int, and returns a value */
{
FILE *f1, *f2, *f3;
char str[MAXC] = "", st1[MAXFN] = ""; /* initialize arrays 0 */
int c, num[MAXND] = {0}, lineo = 0, tokenvalue = 0, i = 0, j = 0, k = 0;
printf ("\nEnter the c program: ");
if (!fgets (st1, 10, stdin)) {
fprintf (stderr, "error: invalid input 'st1'\n");
return 1;
}
if (!(f2 = fopen ("input", "w"))) { /* validate opening */
fprintf (stderr, "error: file open failed 'input'.\n");
return 1;
}
/* The while takes input from stdin and writes to f1, but has nothing
* to do with the file you opened "input". I'm guessing you want to
* read file stream f1 (copy it) into "input" so you can reopen it
* in "r" mode and check for identifiers, keywords, etc.
*
* You cannot redirect a file to your code, and then prompt for
* a filename -- fgets will take the code as your filename
* (or as much will fit) because stdin is FIFO, not LIFO
*
while ((c = getchar ()) != '\n' && c != EOF)
fputc (c, f1);
*/
if (!(f1 = fopen (st1, "r"))) { /* validate opening */
fprintf (stderr, "error: file open failed '%s'.\n", st1);
return 1;
}
while ((c = fgetc (f1)) != EOF) /* you should really do this with fgets */
fputc (c, f2); /* and read/write a line at a time */
fclose (f1);
if (fclose (f2)) { /* validate close after *write*, stream error */
fprintf (stderr, "error: on stream close after write 'f2'.\n");
return 1;
}
if (!(f1 = fopen ("input", "r"))) { /* validate opening */
fprintf (stderr, "error: invalid input 'input'\n");
return 1;
}
if (!(f2 = fopen ("identifier", "w"))) { /* validate opening */
fprintf (stderr, "error: invalid input 'identifier'\n");
return 1;
}
if (!(f3 = fopen ("specialchar", "w"))) { /* validate opening */
fprintf (stderr, "error: invalid input 'specialchar'\n");
return 1;
}
while ((c = fgetc (f1)) != EOF) {
if (isdigit (c)) {
tokenvalue = c - '0';
c = fgetc (f1); /* fgetc guarantees single evaluation */
while (isdigit (c)) {
tokenvalue *= 10 + c - '0';
c = fgetc (f1);
}
num[i++] = tokenvalue;
ungetc (c, f1);
} else if (isalpha (c)) {
fputc (c, f2);
if ((c = fgetc (f1)) && c != EOF) /* need () around assignment */
while (isdigit (c) || isalpha (c) || c == '_' || c == '$') {
putc (c, f2);
c = fgetc (f1);
}
fputc (c, f2);
ungetc (c, f1);
} else if (c == ' ' || c == '\t') /* one 'space' for a char */
putchar (' '); /* printing empty-char ?, looks like 'space' or 0 */
else if (c == '\n')
lineo++;
else
putc (c, f3);
}
if (fclose (f2)) { /* validate close after *write*, stream error */
fprintf (stderr, "error: on stream close after write 'f2'.\n");
return 1;
}
if (fclose (f3)) { /* validate close after *write*, stream error */
fprintf (stderr, "error: on stream close after write 'f3'.\n");
return 1;
}
fclose (f1);
printf ("\nThe nm. in the program are: ");
for (j = 0; j < i; j++)
printf ("%d", num[j]);
putchar ('\n'); /* no need for printf for a single 'char' */
if (!(f2 = fopen ("identifier", "r"))) { /* validate opening */
fprintf (stderr, "error: invalid input 'identifier'\n");
return 1;
}
k = 0;
printf ("The keywords and identifiers are: ");
while ((c = fgetc (f2)) != EOF) {
if (k + 1 < MAXC && c != '\0') /* you must limit chars to str len */
str[k++] = c; /* and your logic needs a rework */
else {
str[k] = 0;
keyword (str);
k = 0;
}
}
putchar ('\n');
fclose (f2);
if (!(f3 = fopen ("specialchar", "r"))) { /* validate opening */
fprintf (stderr, "error: invalid input 'specialchar'\n");
return 1;
}
printf ("\nSpecial Characters are: ");
while ((c = getc (f3)) != EOF)
printf ("%c", c);
putchar ('\n');
fclose (f3);
printf ("Total no. of lines are: %d\n", lineo);
}
我运行了一个简短的 C 文件来测试你的逻辑。你还有一些工作要做。编译它并运行您的数据,如果您有任何其他问题,请告诉我。显示您仍有工作要做的示例是:
输入文件
$ nl -ba whileit.c
1 #include <stdio.h>
2 #include <string.h>
3
4 int main (void) {
5
6 char a[] = "You are welcome",
7 b[5][20] = {{0}},
8 *pch;
9 int i = 0;
10
11 pch = strtok ( a," \t" );
12
13 while (i < 5 && pch) {
14 strcpy (b[i++], pch);
15 pch = strtok( NULL, " \t\n" );
16 }
17
18 i = 0;
19 while (*b[i]) {
20 printf( "b[%d] = %s\n", i, b[i] );
21 i++;
22 }
23
24 return 0;
25 }
示例使用/输出
$ ./bin/fopenprob
Enter the c program: whileit.c
The nm. in the program are: 52000500 // nm is correct
The keywords and identifiers are: identifier : include s
identifier : dio.h>inc
identifier : ude strin
identifier : .h>int ma
identifier : n void)ch
identifier : r a[You a
identifier : e welcome
identifier : b[pch;int
identifier : i pch str // keyword logic needs work
identifier : ok a,t"wh
identifier : le i pch)
identifier : trcpy b[i
identifier : pch)pch s
identifier : rtok(NULL
identifier : t\n"i whi
identifier : e b[i]pri
identifier : tf(b[d]s\
identifier : "i,b[i]i+
Special Characters are: #<.>#<.>(){[]="",[][]={{}},*;=;=(,"\");(<&&){([++],);=(,"\\");}=;(*[]){("[%]=%\",,[]);++;};}
Total no. of lines are: 25
写入的文件
$ nl -ba input
1 #include <stdio.h>
2 #include <string.h>
3
4 int main (void) {
5
6 char a[] = "You are welcome",
7 b[5][20] = {{0}},
8 *pch;
9 int i = 0;
10
11 pch = strtok ( a," \t" );
12
13 while (i < 5 && pch) {
14 strcpy (b[i++], pch);
15 pch = strtok( NULL, " \t\n" );
16 }
17
18 i = 0;
19 while (*b[i]) {
20 printf( "b[%d] = %s\n", i, b[i] );
21 i++;
22 }
23
24 return 0;
25 }
(为了便于阅读,在 79 个字符处手动换行 - 文件中没有:)
$ cat identifier
include stdio.h>include string.h>int main void)char a[You are welcome"b[pch;int
i pch strtok a,t"while i pch)strcpy b[i+pch)pch strtok(NULL,t\n"i while b[i]pri
ntf(b[d]s\n"i,b[i]i+return
$ cat specialchar
#<.>#<.>(){[]="",[][]={{}},*;=;=(,"\");(<&&){([++],);=(,"\\");}=;(*[]){("[%]=%\
",,[]);++;};}
如您所见,您的关键字和标识符逻辑需要工作。提示,要识别关键字和标识符,您必须确保仅将开头带有标识符的字符串发送到您的关键字
函数。我已经修改了您的 keyword
函数以使用 strncmp
来测试关键字,因此您可以发送例如"for(i=0"
为 keyword
,它会识别 "for"
,但必须确保 str
以关键字开头。我还在您的代码中留下了额外的注释以进行改进。这应该足以让您继续前进,而无需“为您做”:)
关于c - 如何在不继续循环的情况下显示输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38842868/
我正在我的应用程序后台下载视频。如果用户在下载过程中重启了应用/设备,有什么方法可以在他们下次启动应用时从他们中断的地方继续下载? 最佳答案 这主要取决于文件服务器的配置(HTTP、FTP 等)。 现
我正在试验 WPF 动画,但有点卡住了。这是我需要做的: 鼠标悬停: 淡入(2 秒内从 0% 到 100% 不透明度) MouseOut: 暂停 2 秒 淡出(2 秒内从 100% 到 0% 不透明度
我的问题是这个线程的延续: Ant: copy the same fileset to multiple places 我是映射器的新手。有人(carej?)可以分享一个使用映射器来做到这一点的例子吗
继续previous question我希望能够显示一些事件指示器即使主线程被阻塞。(基于this article)。 基于所附代码的问题: 使用 Synchronize(PaintTargetWin
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我有一个场景,其中有一个线程在等待和执行任务之间循环。但是,我想中断线程的等待(如果愿意,可以跳过其余的等待)并继续执行任务。 有人知道如何做到这一点吗? 最佳答案 我认为你需要的是实现 wait()
这是我的代码架构: while (..) { for (...; ...;...) for(...;...;...) if ( )
import java.util.Scanner; public class InteractiveRectangle { public static void main(String[] args)
如何将 continue 放入具有函数的列表理解中? 下面的示例代码... import pandas as pd l = list(pd.Series([1,3,5,0,6,8])) def inv
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我正在用 python 开发一个程序,遇到了一个我不知道如何解决的问题。我的意图是使用 with 语句,避免使用 try/except。 到目前为止,我的想法是能够使用 continue 语句,就像在
我对下一段代码的执行感到困惑: label: for (int i = 0; i < 100; i++) { if (i % 2 == 0) c
这很好用: #include int main(){ volatile int abort_counter = 0; volatile int i = 0; while (i
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
如果不满足某些条件,我会尝试跳到循环的下一次迭代。问题是循环仍在继续。 我哪里出错了? 根据第一条评论更新了代码示例。 foreach ($this->routes as $route =>
如果不满足某些条件,我会尝试跳到循环的下一次迭代。问题是循环仍在继续。 我哪里出错了? 根据第一条评论更新了代码示例。 foreach ($this->routes as $route =>
Android项目中的一个需求:通过线程读取文件内容,并且可以控制线程的开始、暂停、继续,来控制读文件。在此记录下。 直接在主线程中,通过wait、notify、notifyAll去控制读文件的线
link text 我得到了引用计数的概念 所以当我执行“del astrd”时,引用计数降为零并且 astrd 被 gc 收集? 这是示例代码。这些代码是我在昨天的问题之后开发的:link text
我想首先检查我的 Range 是否有 #NA 错误,然后在退出宏之前显示包含错误的单元格地址。这是我到目前为止所做的。 现在,如果出现错误,我想显示 MsgBox警告用户错误并停止程序的其余部分执行,
while( (c = fgetc(stdin)) != EOF ){ count++; if (count == lineLen - 1){ moreChars =
我是一名优秀的程序员,十分优秀!