-3

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

否则打印字符

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);
}

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

    ï
 »
 ؟
 ط
 §
 ظ
 „
 ظ
 …
 ط
 ¤

有什么帮助吗?

4

4 回答 4

1
char d;
//...
if (d ="ا")

d is a char and you are assigning it to a character array of size 2. So you are squashing memory (for one), and your comparison will always be non-zero, so your condition will always be true and you will always run the block under your if-condition. What you wanted was

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);
}
于 2013-11-05T23:13:40.663 回答
1

你的问题在这里

if (d ='ا')

你分配'ا'd

你应该==

if (d =='ا')
于 2013-11-05T23:09:43.173 回答
1

if (d ="ا")

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

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

您也有一个问题,因为您已定义d为 achar而不是int. 要EOF正确进行比较,您确实需要将其设为int.

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

int ch;

while ((ch=getc()) != EOF) // or: `while (EOF != (ch=getc()))`
   printf("%c\n", ch == 'ا' ? '@' : ch);
于 2013-11-05T23:09:51.230 回答
0

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

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

此外,更改cc = getc (fp);d = getc(fp). 我不知道是什么cc

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

于 2013-11-05T23:13:33.640 回答