我尝试在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);
}
答案 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)
回应Noelkd的comment询问“@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;
}
主要差异:
ptr
,而不是稍后分配。a
。a
。for
循环中使用C99 / C ++声明,以避免在顶部声明i
,j
,k
,l
。如果强制使用C89,那么我不会包含初始值设定项,因为变量在使用时已设置。switch
的操作都用大括号括起来。switch
中的每个案例都以break
结尾(即使在技术上不必要;它会使未来的更改更加可靠)。我非常喜欢大括号布局的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