我正在編寫一個C程序,它涉及通過.txt文件並查找文件中使用的所有可打印字符(或可能是圖形字符),這些字符是而不是。我知道頭文件ctype.h定義了幾個字符類(例如數字,小寫字母,大寫字母等),並提供了檢查給定字符是否屬於每個類的函數,但我不確定是否可以做相反的事情(例如,檢查某個類中的字符全部)。我需要列出或定義每種類型中所有字符的東西,理想情況下是數組或枚舉類型。有沒有辦法查看ctype.h中的哪些字符?
回答
不知道這是否有幫助,但是我編寫了一個程序來根據給定文件中的字符對字符進行分類。解決這個問題並不難,無條件地檢查範圍爲0..255的字符(字節)。
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
static void classifier(FILE *fp, char *fn)
{
int c;
int map[UCHAR_MAX + 1];
size_t i;
printf("%s:\n", fn);
for (i = 0; i < UCHAR_MAX + 1; i++)
map[i] = 0;
printf("Code Char Space Upper Lower Alpha AlNum Digit XDig Graph Punct Print Cntrl\n");
while ((c = getc(fp)) != EOF)
{
map[c] = 1;
}
for (c = 0; c < UCHAR_MAX + 1; c++)
{
if (map[c] == 1)
{
int sp = isspace(c) ? 'X' : ' ';
int up = isupper(c) ? 'X' : ' ';
int lo = islower(c) ? 'X' : ' ';
int al = isalpha(c) ? 'X' : ' ';
int an = isalnum(c) ? 'X' : ' ';
int dg = isdigit(c) ? 'X' : ' ';
int xd = isxdigit(c) ? 'X' : ' ';
int gr = isgraph(c) ? 'X' : ' ';
int pu = ispunct(c) ? 'X' : ' ';
int pr = isprint(c) ? 'X' : ' ';
int ct = iscntrl(c) ? 'X' : ' ';
int ch = (pr == 'X') ? c : ' ';
printf("0x%02X %-4c %-6c%-6c%-6c%-6c%-6c%-6c%-6c%-6c%-6c%-6c%-6c\n",
c, ch, sp, up, lo, al, an, dg, xd, gr, pu, pr, ct);
}
}
}
額外的技巧,我的代碼拉用setlocale()
當前區域設置,而不是C語言環境中的工作:
#include <locale.h>
int main(int argc, char **argv)
{
setlocale(LC_ALL, "");
filter(argc, argv, 1, classifier);
return(0);
}
的filter()
功能從argv[1]
處理參數(通常optind
,而是隻傳遞1
,但在此代碼中沒有條件參數處理)至argv[argc-1]
,讀取文件(或者在沒有命名文件時讀取標準輸入)。它要求classifier()
爲它打開每個文件 - 並處理打開,關閉等
好的,這非常漂亮 - 每個*字符類*的一個很好的表格輸出適用於每個文件(或stdin)中的每個字符。 –
我的建議:
有256個元素創建的
unsigned long
秒的陣列,可以次的char
老數發生在文件中。按字符讀取文件內容並更新數組中的數據。
處理文件的所有字符後,遍歷數組的元素並打印必要的信息。
int main()
{
unsigned long charOccurrences[256] = {0};
// open the file.
FILE* fin = fopen(....);
int c;
while ((c = fgetc(fin)) != EOF)
{
// Increment the number of occurrences.
charOccurrences[c]++;
}
// Process the data.
for (int i = 0; i < 256; ++i)
{
if (isprint(i) && charOccurrences[i] == 0)
{
printf("%c was not found in the file.\n", i);
}
}
// Close the file
fclose(fin);
}
我輸入的速度比你慢一點;-)我可以建議使用long數組而不是int數組,以便與文件中可能預期的最大字符數一致(至少根據ftell()的返回值)? – Christophe
@Christophe,很好的建議。我將它改爲'unsigned long'。 –
'printf(%s在文件中找不到\ n「);'並且可能不正確的格式。 – chqrlie
有一個在ctype.h
沒有固定的字符列表,可以幫助你。實際上isprint()
取決於語言環境。
假設你說的char
而不是寬字符,解決您的問題一個辦法是初始化256個元素表中,每一個代表一個字符:
char mychars[256];
memset(mychars, 0, 256);
然後打開你的文件,閱讀所有的字符,並標記那些存在:
:...
int c;
while ((c=fgetc(fp)) != EOF) {
mychars[c] |= 1;
}
再後來,你可以通過打印那些只是想迭代10
'isprint()'(或'isgraph()')似乎是回答這個問題的關鍵。 –
您可以迭代unsigned char
類型的所有值,從0
到UCHAR_MAX
,並檢查<ctype.h>
中的每個函數以確定類是什麼。
例如,您可以列出這一切的數字:
printf("digits: ");
for (int c = 0; c <= UCHAR_MAX; c++) {
if (isdigit(c))
putchar(c);
}
printf("\n");
- 1. 有沒有辦法查看TortoiseSVN正在執行哪些命令?
- 2. 有沒有辦法查看eclipse執行哪些命令?
- 3. 有沒有辦法查看哪些實體在Appstats中被訪問?
- 4. 有沒有辦法查看哪些項目未在magento中歸類?
- 5. 有沒有辦法在Xcode中查看某些點?
- 6. 在谷歌Analytics(分析),有沒有辦法,看看哪些天有最交易?
- 7. 有沒有辦法查看哪些文件包含/需要其他文件?
- 8. 有沒有辦法查看哪些函數/執行時間最長?
- 9. R:有沒有辦法查看列表
- 10. 有沒有辦法查看HttpRuntime.Cache?
- 11. 有沒有辦法從encodeURIComponent中排除某些字符
- 12. 有沒有辦法查看哪些像素與iPhone模擬器上的十字線配合使用?
- 13. PHP:有沒有辦法看到「隱形」字符,如\ n
- 14. 有沒有辦法查看xcode中包含文件的順序
- 15. 有沒有辦法查看Construct 2中的實際代碼?
- 16. 有沒有辦法像IRB中的代碼一樣查看?
- 17. 有沒有辦法如何從EditText中的`drawableRight`圖標查看?
- 18. 有沒有辦法查看C++中的內置文檔?
- 19. 有沒有辦法在javascript中檢測查看器的主頁?
- 20. 有沒有辦法在python中查看float的內部表示?
- 21. 有沒有辦法查看LinqPad中擴展的網格結果?
- 22. Django - 有沒有辦法查看ORM執行的查詢?
- 23. 有沒有辦法檢查SWF以查看它使用的RSL?
- 24. 有沒有辦法檢查一個C#字符串的編碼?
- 25. 有沒有辦法顯示你在mysql中更新了哪些字段?
- 26. 有沒有辦法從字符串中刪除字符? Java
- 27. 有沒有辦法看到哪個PHP腳本佔用CPU?
- 28. 使用access和mysql時,有沒有辦法查看哪些查詢用於生成數據透視表?
- 29. 有沒有辦法測試寶石是否在工作?或者查看它具有哪些功能
- 30. 有沒有辦法在linux中查看誰查看/訪問過一個文件?
你爲什麼不看看'ctype.h'自己? – user3078414
宏名稱和描述不夠? – usr2564301
可用的字符數量是有限的,並且根據您的編碼可能會低至128.您可以調用每個函數的'ctype'函數。 – rodrigo