C 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

我试着在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]='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