![](/img/trans.png)
[英]'isprint' returning true for a non printable character on solaris
[英]ANSI C: isprint() returns true for non-ASCII character?
我有一些C代碼,應該打印文件的全部內容。 該程序以前可以很好地打印文件,但是當它打印一秒鍾時,我總是看到絕對不應該存在的Unicode字符。
int c = fgetc(file);
putchar((!isprint(c) ? : c));
(包裝while(!feof(file))
)
除非我弄錯了,否則應該只打印ASCII可打印字符。 無論如何,它打印的第一件事是\\357\\277\\275
,它不是ASCII且不可打印。
該文件僅包含以下內容: foo+bar.foo+t-bar.foo+completely fake
並打印以下內容: foo+bar.foo+t-bar.foo+completely fake
(在陌生字符與其余字符之間使用換行符)。
只需簡單地打印所有內容(la putchar(c)
),即可將完全相同的字符放在行尾。
我什至嘗試使用另一個文件(通過重命名舊文件並使用到另一個的軟鏈接),但得到的結果完全相同。
如果文件為空,它也會這樣做。
該文件是純文本,是用vim創建的,沒有什么特別的。
這是原始代碼:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
int main(void)
{
char *headp = "../include/header";
char *listp = "../.piclist";
FILE *head, *list;
puts("Content-Type: text/html; charset=utf-8\nExpires: 0\n");
puts("<!DOCTYPE html>\n<html lang='en'>\n<head>");
puts("\t<title>Foo</title>");
puts("\t<link rel='stylesheet' href='/css/main.css' />");
puts("\t<link rel='stylesheet' href='/css/foo.css' />");
puts("</head>\n<body>");
head = fopen(headp, "r");
if (errno) {
perror("cannot open include/header");
errno = 0;
} else {
while (!feof(head)) putchar(fgetc(head));
putchar('\n');
fclose(head);
}
list = fopen(listp, "r");
if (errno) perror("cannot open .piclist");
else {
while (!feof(list)) {
while (!feof(list)) {
int c = fgetc(list);
putchar((!isprint(c) ? : c));
}
}
fclose(list);
} /* else */
fputs("\n<footer>\n\t<hr />\n\t<p>Copyright 2011-2012 the ", stdout);
fputs("<a href='mailto:foo@example.com'> ", stdout);
fputs("Foo Bar of Baz</a> of ", stdout);
fputs("<a href='http://blah.org'>Blah United ", stdout);
fputs("</a></p>\n</footer>\n</body>\n</html>\n",stdout);
return 0;
}
不要使用feof()(至少不是您使用它的方式)
另外,您對errno的使用是錯誤的。 errno 僅在某些操作指示錯誤返回后包含一個可用值(通常為NULL或-1作為返回值)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
int main(void)
{
char *headp = "../include/header";
char *listp = "../.piclist";
FILE *head, *list;
int ch;
puts("Content-Type: text/html; charset=utf-8\nExpires: 0\n");
puts("<!DOCTYPE html>\n<html lang='en'>\n<head>");
puts("\t<title>Warrenton Latin School | Gallery</title>");
puts("\t<link rel='stylesheet' href='/css/main.css' />");
puts("\t<link rel='stylesheet' href='/css/gallery.css' />");
puts("</head>\n<body>");
head = fopen(headp, "r");
if (!head) {
perror("cannot open include/header");
errno = 0;
} else {
while (1) {
ch = fgetc(head);
if (ch == EOF) break;
putchar(ch);
}
putchar('\n');
fclose(head);
}
list = fopen(listp, "r");
if (!list) perror("cannot open .piclist");
else while (1) {
ch = fgetc(list);
if (ch == EOF) break;
putchar((!isprint(c) ? : c));
}
fclose(list);
fputs("\n<footer>\n\t<hr />\n\t<p>Copyright 2011-2012 the ", stdout);
fputs("<a href='mailto:warrentonlatinschool@gmail.com'> ", stdout);
fputs("Warrenton Latin School</a> co-op of ", stdout);
fputs("<a href='http://warrentonumc.org'>Warrenton United ", stdout);
fputs("Methodist Church</a></p>\n</footer>\n</body>\n</html>\n",stdout);
return 0;
}
忽略代碼中可能的錯誤isprint()
考慮所有可打印字符,除了0x00
- 0x1f
和0x7f
。
諸如UTF BOM和7位ANSI以外的其他字符之類的內容仍可以打印(盡管其含義可能會隨編碼而變化)。
當您將?:的第二個運算符留空時,它等於條件的結果。 對於不可打印的字符,isprintc(c)返回0,因此三進制運算符的條件部分為!0,它等於1。因此,putchar嘗試打印無效的ASCII字符並中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.