簡體   English   中英

ANSI C:isprint()對於非ASCII字符是否返回true?

[英]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 - 0x1f0x7f

諸如UTF BOM和7位ANSI以外的其他字符之類的內容仍可以打印(盡管其含義可能會隨編碼而變化)。

當您將?:的第二個運算符留空時,它等於條件的結果。 對於不可打印的字符,isprintc(c)返回0,因此三進制運算符的條件部分為!0,它等於1。因此,putchar嘗試打印無效的ASCII字符並中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM