我真的定義一個struct保持字母和數字一起;數據格式強烈表明它們有密切的關係。這是一個例證這個想法的程序。
scanf格式是有點很難得到正確的(儘可能簡單,但並不簡單)。例如RoadRunner在他的回答中忘記了跳過信件前面的空格。
它有助於我們(我假設)只有單個字母。記住除%c之外的所有標準格式都會跳過空格,這很有幫助。 (這句話的兩部分應該記住。)
#include<stdio.h>
#define ARRLEN 10000
// Keep pairs of data together in one struct.
struct CharIntPair
{
char letter;
int number;
};
// test data. various space configurations
// char *data = " A1, B22 , C333,D4,E5 ,F6, Z12345";
void printParsedPairs(struct CharIntPair pairs[], int count)
{
printf("%d pairs:\n", count);
for(int i = 0; i<count; i++)
{
printf("Pair %6d. Letter: %-2c, number: %11d\n", i, pairs[i].letter, pairs[i].number);
}
}
int main()
{
setbuf(stdout, NULL);
setbuf(stdin, NULL);
// For the parsing results
struct CharIntPair pairs[ARRLEN];
//char dummy [80];
int parsedPairCount = 0;
for(parsedPairCount=0; parsedPairCount<ARRLEN; parsedPairCount++)
{
// The format explained>
// -- " ": skips any optional whitespace
// -- "%c": reads the next single character
// -- "%d": expects and reads a number after optional whitespace
// (the %d format, like all standard formats except %c,
// skips whitespace).
// -- " ": reads and discards optional whitespace
// -- ",": expects, reads and discards a comma.
// The position after this scanf returns with 2 will be
// before optional whitespace and the next letter-number pair.
int numRead
= scanf(" %c%d ,",
&pairs[parsedPairCount].letter,
&pairs[parsedPairCount].number);
//printf("scanf returned %d\n", numRead);
//printf("dummy was ->%s<-\n", dummy);
if(numRead < 0) // IO error or, more likely, EOF. Inspect errno to tell.
{
printf("scanf returned %d\n", numRead);
break;
}
else if(numRead == 0)
{
printf("scanf returned %d\n", numRead);
printf("Data format problem: No character? How weird is that...\n");
break;
}
else if(numRead == 1)
{
printf("scanf returned %d\n", numRead);
printf("Data format problem: No number after first non-whitespace character ->%c<- (ASCII %d).\n",
pairs[parsedPairCount].letter, (int)pairs[parsedPairCount].letter);
break;
}
// It's 2; we have parsed a pair.
else
{
printf("Parsed pair %6d. Letter: %-2c, number: %11d\n", parsedPairCount,
pairs[parsedPairCount].letter, pairs[parsedPairCount].number);
}
}
printf("parsed pair count: %d\n", parsedPairCount);
printParsedPairs(pairs, parsedPairCount);
}
我掙扎了一下與bash和mintty在Windows 8%C我的cygwin環境下有時會遇到一個換行符(ASCII 10)應被前面的空白吃飯空間吃掉,破壞了解析。 (更嚴格的解析會在發生錯誤後嘗試讀取char字符,直到遇到下一個逗號,並嘗試從那裏恢復。)
發生這種情況時,我鍵入Ctr-D(或者,我認爲,也Ctr-Z在控制檯窗口中)試圖發信號EOF;以下輸入關鍵行程將導致換行符「到達」%c。當然,在Windows系統上的POSIX仿真中的文本I/O是棘手的;我必須假設在翻譯CR-NL序列之間來回轉換這個錯誤。在通過ssh/putty的linux系統上,它按預期工作。
是的,這是可能的。 –
爲什麼不使用'getc()',在這種情況下使用'fscanf'可能會很困難。 – RoadRunner
@RoadRunner使用scanf是最好的選擇,至少當它總是單個字母時。格式將簡單地爲「%c%d」。然後讀出逗號。 T.can的回答幾乎涵蓋了它。 –