【问题标题】:read the character and pint it if not equal to ا读取字符并在不等于 ا 时打印
【发布时间】:2013-11-17 00:42:37
【问题描述】:

我尝试使用此代码读取文本文件中的每个字符,如果字符 =ا print @

否则打印字符

void
preprocess_file (FILE *fp)

{
  char d;

    for (;;)
      { 
    d = getc (fp);
    if (d == EOF)
        break;
        if (d =='ا')
        printf ("@\n");
        else
    printf ("%c\n ", d);
      }
}

int
main(int argc, char *argv [])
{
    preprocess_file (stdin);

    exit (0);
}

但是输出文件显示如下奇怪的结果

    ï
 »
 ؟
 ط
 §
 ظ
 „
 ظ
 …
 ط
 ¤

有什么帮助吗?

【问题讨论】:

  • 代码有什么问题?缩进,对于初学者来说。
  • 1. cc 在一个地方,d 在另一个地方。
  • 这个问题似乎是题外话,因为它是关于一个已经讨论过很多次的小问题,而且解决方案不需要任何东西,只要在课堂上真正注意。
  • 您可能遇到了代码集和宽字符输入问题; 'ا' 字符的 Unicode 值 U+0267 不适合单个字节。

标签: c++ c file


【解决方案1】:
char d;
//...
if (d ="ا")

dchar 并且您将其分配给大小为 2 的字符数组。因此您正在压缩内存(对于一个),并且您的比较将始终为非零,因此您的条件将始终为true 并且您将始终在您的 if 条件下运行该块。你想要的是

char d;

for (;;)
{ 
    d = getc (fp); // should be d, not cc
    if (d == EOF)
        break;

    if (d == 'ا') // note the SINGLE quotes
        printf ("@\n");
    else
        printf ("%c\n ", d);
}

【讨论】:

  • 一开始我也没有注意到它(有一段时间没有做过 C 风格的 I/O),但是为了正确地与 EOF 进行比较,你想将 d 更改为 @ 987654326@ 而不是 char
  • @JerryCoffin 从技术上讲,是的。不过,由于 EOF = -1,应该 只需进行 d == EOF 检查即可。当然,(int)d == EOF 会更准确——但这一直困扰着我关于 C 字符函数的问题(为什么他们决定使用int 来操作char 超出了我的理解)。
  • @ZacHowland:d==EOF 是的。问题是您可以在输入中包含 255,它将被转换为 -1 作为字符,但 与真正的 EOF 相同(并转换为 int won也无济于事)。他们使用了int,因此 EOF 可以/将不同于可以从文件中读取的任何值。
  • 但是 255 不是 char 的有效值(unsigned char,是的,char,否)。
【解决方案2】:

你的问题来了

if (d ='ا')

您将'ا' 分配给d

你应该==

if (d =='ا')

【讨论】:

  • d 作为char 可以与另一个char 进行比较,但不能与char* 比较,"|" 就是这样。您需要将双引号替换为单引号。
【解决方案3】:

if (d ="ا")

对于比较,您需要== 而不是=,以及单个字符而不是字符串文字,例如d == 'ا'

按原样,它尝试将字符串文字(必须为非空)的地址分配给char,然后检查结果是否为非零。虽然从指针到 char 的转换可能会产生 0 或一些非 0 值,但它可能会产生 一致 值,因此至少在典型实现中,该代码将始终执行.

您还有一个问题,因为您将d 定义为char 而不是int。要正确地与EOF 进行比较,您确实需要将其设为int

如果我这样做,我想我会做一些不同的事情——按照这个一般顺序:

int ch;

while ((ch=getc()) != EOF) // or: `while (EOF != (ch=getc()))`
   printf("%c\n", ch == 'ا' ? '@' : ch);

【讨论】:

  • dchar,而不是 char*,因此没有必要取消引用它。
【解决方案4】:

你应该写:if (d == 'ا')

== 不是 ='|'char,否则它是一个字符串。

另外,将cc = getc (fp); 更改为d = getc(fp)。我不知道cc是什么。

您可能对那个字符有一些问题,特别是如果您将文件保存为 UTF-8。但是处理多字节字符很困难,尤其是对于初学者。看看那个答案:https://stackoverflow.com/a/1373520/1787973

【讨论】:

  • 我做到了,但它在输出中显示了奇怪的字符,当制作程序时它显示 gcc -g -O -Wall -ansi -pedantic ascii1.c -o ascii1 ascii1.c: In function 'preprocess_file' : ascii1.c:19:12: 警告:多字符字符常量
  • @user1200219 你的字符 ا 不是 ascii 字符,不能保存在字符中。您可能需要 unicode 支持,我认为您目前不想参与其中。无意冒犯。
  • 以非 UTF-8 格式保存您的文件。例如 ISO-8859-15。
猜你喜欢
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多