fprintf语句在代码块中没有正确执行

时间:2014-06-26 11:29:10

标签: c printf

我尝试在code :: blocks中运行这个程序来显示名称列表,但执行在fprintf停止。我尝试了另一个程序(如下所示)和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;
}

这是完美运作的程序

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
main()
{
    char a[50],b[50];
    printf("Enter a name\n");
    gets(b);
    FILE *ptr;
    ptr=fopen("D:\\test.txt","w+");
    fprintf(ptr,"%s",b);
    rewind(ptr);
    fscanf(ptr,"%s",&a);
    printf("%s",a);
    fclose(ptr);
}

3 个答案:

答案 0 :(得分:1)

我已经整理了你的代码:

#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;

}

我认为问题是字符串a没有包含零终结符字节,所以我添加了一个。您还应确保在尝试写入文件之前成功打开文件,因此我也添加了该文件。评论已留在相关部分的代码中。

我已经确认这与this一起使用。

答案 1 :(得分:1)

我已将您的代码缩进到自己的帖子中 您必须正确缩进代码,以避免程序混乱。

缩进后,我看到你正在严重使用switch() 实际上,即使没有严格要求,也应始终将大括号用于开关。在这里你有一个很好的模型可以考虑:

 switch(expression)
 {
    case 1:
      sentences...
      break;
    case 2:
      sentences...
      break;
    default:
      sentences...
      break;
 }

嵌套循环和切换句子的过多使得难以遵循程序的逻辑。

答案 2 :(得分:0)

回应Noelkdcomment询问“@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;
}

主要差异:

  1. 使用命名字符串作为文件名,因此我可以在必要时在错误消息中报告文件名。
  2. 如果无法打开文件,则报告错误。
  3. 初始化ptr,而不是稍后分配。
  4. 调整a
  5. 初始化a
  6. for循环中使用C99 / C ++声明,以避免在顶部声明ijkl。如果强制使用C89,那么我不会包含初始值设定项,因为变量在使用时已设置。
  7. 每个switch的操作都用大括号括起来。
  8. 每个switch中的每个案例都以break结尾(即使在技术上不必要;它会使未来的更改更加可靠)。
  9. 在打印操作中添加换行符。
  10. 删除操作周围现在多余的括号。
  11. 我非常喜欢大括号布局的Allman,但是我认识到同样强烈的观点支持替代方案。支撑布局不是我不喜欢noelkd重新格式化的原因之一。

    我还使用了四个空格的缩进。很长一段时间,我使用tabstops设置为4的标签,但在过去十年左右我没有切换到标签。当程序忽略任何参数时,我使用显式int main(void)。我使用编译:

    $ gcc -g -O3 -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
    >      -Werror  fp2.c -o fp2
    

    (或我使用-std=c11)。我有时会使用其他选项,例如-Wshadow-Wold-style-declaration-Wold-style-definition

    当我运行代码时,我得到了16,900行输出:

    laaaaa
    laaaae
    laaaai
    laaaao
    laaaau
    …
    lazuza
    lazuze
    lazuzi
    lazuzo
    lazuzu