C fprintf语句在代码块中未正确执行
我试着在code::blocks中运行这个程序来显示一个名称列表,但执行在fprintf处停止C fprintf语句在代码块中未正确执行,c,printf,C,Printf,我试着在code::blocks中运行这个程序来显示一个名称列表,但执行在fprintf处停止 #include<stdio.h> #include<string.h> #include<stdlib.h> int main() { FILE *ptr; ptr=fopen("D:\\test.txt","w+"); char a[5]; char i='a',j='a',k='a',l='a'; a[0]='l'; a[1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
FILE *ptr;
ptr=fopen("D:\\test.txt","w+");
char a[5];
char i='a',j='a',k='a',l='a';
a[0]='l';
a[1]='a';
for(i='a';i<=121;i++)
{
a[2]=i;
for(j='a';j<=121;j++)
{
a[3]=j;
switch(j)
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
for(k='a';k<=121;k++)
{
a[4]=k;
for(l='a';l<=117;l++)
{
switch(l)
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':{a[5]=l;fprintf(ptr,"%s",a);}
}
}
}
}
fclose(ptr);
return 0;
}
#包括
#包括
#包括
int main()
{
文件*ptr;
ptr=fopen(“D:\\test.txt”,“w+”;
chara[5];
字符i='a',j='a',k='a',l='a';
a[0]=“l”;
a[1]=“a”;
对于(i='a';i我已经整理了您的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
FILE *ptr = NULL;
char a[7];
/* Attempt to open the output file, and exit if something goes wrong. */
ptr = fopen("D:\\test.txt", "w+");
if (!ptr) { return 1; }
/* End the string with a NUL-terminator byte. */
a[0] = 'l';
a[1] = 'a';
a[6] = 0;
for (a[2] = 'a'; a[2] <= 121; a[2]++) {
for (a[3] = 'a'; a[3] <= 121; a[3]++) {
switch (a[3]) {
case 'a': case 'e': case 'i': case 'o': case 'u':
for (a[4] = 'a'; a[4] <= 121; a[4]++) {
for (a[5] = 'a'; a[5] <= 117; a[5]++) {
switch (a[5]) {
case 'a': case 'e': case 'i': case 'o': case 'u':
fprintf(ptr, "%s\n", a);
break;
}
}
}
break;
}
}
}
fclose(ptr);
return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
文件*ptr=NULL;
chara[7];
/*尝试打开输出文件,并在出现问题时退出*/
ptr=fopen(“D:\\test.txt”,“w+”;
如果(!ptr){return 1;}
/*用NUL终止符字节结束字符串*/
a[0]=“l”;
a[1]=“a”;
a[6]=0;
对于(a[2]='a';a[2]我已经在您自己的帖子中缩进了您的代码。
您必须正确缩进代码,以避免程序混乱
缩进之后,我发现您使用的switch()
很糟糕。
在实践中,即使没有严格必要,也应始终将花括号与switch一起使用。这里有一个很好的模型需要考虑:
switch(expression)
{
case 1:
sentences...
break;
case 2:
sentences...
break;
default:
sentences...
break;
}
嵌套循环和切换语句过多,很难遵循程序的逻辑。对于“JonathanLeffler您介意尝试重新格式化吗?”的问题,这或多或少是我格式化它的方式
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
const char file[] = "D:\\test.txt";
FILE *ptr = fopen(file, "w+");
char a[7] = "la";
if (ptr == 0)
{
fprintf(stderr, "Failed to open file %s for writing\n", file);
return 1;
}
for (int i = 'a'; i <= 'z'; i++)
{
a[2] = i;
for (int j = 'a'; j <= 'z'; j++)
{
a[3] = j;
switch (j)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
for (int k = 'a'; k <= 'z'; k++)
{
a[4] = k;
for (int l = 'a'; l <= 'u'; l++)
{
switch (l)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
a[5] = l;
fprintf(ptr, "%s\n", a);
break;
}
}
}
break;
}
}
}
fclose(ptr);
return 0;
}
(或者我使用-std=c11
)。我有时使用额外的选项,如-Wshadow
或-Wold样式声明
或-Wold样式定义
当我运行代码时,我得到16900行输出:
laaaaa
laaaae
laaaai
laaaao
laaaau
…
lazuza
lazuze
lazuzi
lazuzo
lazuzu
谢谢,代码工作得很完美。我对编程比较陌生,但不是一个应该以\0结尾的字符串看一看行a[6]=0
这是将数组的最后一个元素设置为0
,还要注意,如果你说char a[7]
它的索引来自0-6
,也就是说,你不能使用a[7]
不会损坏内存。如果答案有帮助,请回答。我不相信重新格式化(但最好添加break
语句),但我确信“非空终止于原始格式”。我添加了一个社区Wiki答案,其中包含我喜欢的格式。我不需要任何学分,但我不可能在注释中设置代码的格式,也不愿意对您的答案进行如此大的更改。答案很好,但我没有问“怎么做?”[Jonathan Leffler]格式化代码“执行停止可能意味着什么。您应该检查fopen()
在使用结果之前起作用。在使用%s
打印字符串之前,还应确保字符串以null结尾,或者确保将打印长度限制为有效长度。您可能也希望在输出中的某个位置使用换行符。另外,不要使用get()
从来没有。甚至在演示代码中也没有。这是一个坏习惯。它不再是标准C的一部分。您可能应该使用'z'
而不是121,用'u'
代替117.Hmmm;您还声明字符a[5];
,这意味着您只能通过a[4]引用a[0]
。您的代码试图写入a[5]
,这超出了界限(错误)。by会悄悄地将定义更改为char a[7]
,但这是一个关键性的改变,应该大声说出来。事实上,尽管这是一个非常传统的做法,但最初的无括号的开关
是有效的。如果你在实践中说,花括号应该总是与开关
一起使用,即使不是严格必要的,那么我也完全同意你。@JonathanLeff勒:我本来想这么说的。最后,我做了你建议的改变。
$ gcc -g -O3 -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
> -Werror fp2.c -o fp2
laaaaa
laaaae
laaaai
laaaao
laaaau
…
lazuza
lazuze
lazuzi
lazuzo
lazuzu