[英]Opening a file with a title including int and char variables
我想打開一個標題為“ File 10-9B-g06.dat”的文件,其中對所有文件重復“ B”和“ File”,但其余都是可變的。 問題開始於標題中有“ g”的地方。 我將“ g”變量用作字符串,但效果不佳。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int CaseSize, Type, Counter;
char name[100], zahl[20], char Template[1];
FILE *stream;
scanf("%d", &CaseSize );
scanf("%d", &Type );
scanf(" %c", &Template );
scanf("%d", &Counter );
strcpy(name, "File ");
sprintf(zahl, "%d", CaseSize);
strcat(name, zahl);
strcat(name, "-");
sprintf(zahl, "%d", Type);
strcat(name, zahl);
strcat(name, "B-");
sprintf(name, "%c", Template);
strcat(name, zahl);
sprintf(zahl, "%2d", Counter);
strcat(name, zahl);
strcat(name, ".dat");
stream=fopen(name, "a");
fclose(stream);
return 0;
}
我想知道是否有人可以幫助我解釋這個問題,或者他們是否可以引導我到任何我可以瀏覽的示例中。
謝謝。
該代碼在格式說明符和數據類型方面存在許多問題,但除此之外,效率極低且不必要地復雜。
將char Template[1]
更改為char Template
,並刪除多余的zahl[]
,用於構造name
的12行代碼可以簡化為:
sprintf( name, "%s %d-%dB-%c%02d.dat", "File", CaseSize, Type, Template, Counter ) ;
C字符串的一個問題是它們不包含長度信息,因此諸如strcat()
函數必須從開始搜索nul終止符開始進行迭代。 在這里,您在越來越長的字符串上重復使用strcat()
。 因此,在這種短弦構造中,可能並不重要,但在某些情況下,它可能會變得過慢 。 除此之外,更多行代碼僅意味着需要維護和調試更多代碼。 在這里,整個格式在一行代碼中進行了描述,因此維護起來很容易就能看出應該構造什么。
第一個問題似乎是在讀取變量Template時在scanf中使用空格。 在此處查看提示: C scanf出現空格問題
兩個主要問題是:
scanf(“%c”,&Template);
應該
scanf(" %c", &Template[0]);
sprintf(name,“%c”,模板);
應該
sprintf(zahl, "%c", Template[0]);
經過一點測試,這可行:
int main()
{
int CaseSize, Type, Counter;
char name[100];
char zahl[20];
char Template;
FILE *stream;
scanf("%d", &CaseSize);
scanf("%d", &Type);
scanf(" %c", &Template);
scanf("%2d", &Counter);
strcpy(name, "File ");
sprintf(zahl, "%d", CaseSize);
strcat(name, zahl);
strcat(name, "-");
sprintf(zahl, "%d", Type);
strcat(name, zahl);
strcat(name, "B-");
sprintf(zahl, "%c", Template);
strcat(name, zahl);
sprintf(zahl, "%02d", Counter);
strcat(name, zahl);
strcat(name, ".dat");
printf("%s\n", name);
stream=fopen(name, "a");
fclose(stream);
return 0;
}
您可以在一個sprintf
語句中完成所有操作:
sprintf( name, "File %d-%dB-%c%02d.dat", CaseSize, Type, Template, Counter );
鑒於您使用Template
,您不應將其聲明為char
的1元素數組; 表達式&Template
和Template
的類型分別為char (*)[1]
和char *
,這不是您想要的。 改為將其聲明為純char
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.