Ascii字符编码问题

时间:2014-05-18 15:56:14

标签: c ascii

#include <stdio.h>
int main()
{
    char line[80];
    int count;
    // read the line of charecter
    printf("Enter the line of text below: \n");
    scanf("%[ˆ\n]",line);
// encode each individual charecter and display them
    for(count = 0; line[count]!= '\0'; ++ count){
        if(((line[count]>='0')&& (line [count]<= '9')) ||
           ((line[count]>= 'A')&& (line[count]<='Z')) ||
           ((line[count]>= 'a')&& (line[count]<='z')))
            putchar(line[count]+1);
        else if (line[count]=='9')putchar('0');
        else if (line [count]== 'A')putchar('Z');
        else if (line [count]== 'a') putchar('z');
        else putchar('.');
    }
}

在上面的代码问题是转换编码。每当我编译代码时,编译器会自动转换编码,然后我无法获得所需的输出。 我的目标输出应该如下:

enter the string
Hello World 456
Output
Ifmmp.uif.tusjof

对于每个字母,它被第二个字母替换,空格被替换为&#39; .&#39;。

3 个答案:

答案 0 :(得分:2)

这是可疑的:

scanf("%[ˆ\n]",line);

应该是:

scanf("%79[^\n]",line);

您的版本有多字节字符,有点像^,而不是^。这会导致您的扫描出现故障。您的症状听起来好像输入的文本实际上是多字节字符。

顺便说一句,您可以使用isalnum( (unsigned char)line[count] )让您的代码更易于阅读。该测试取代了你的a-z,A-Z,0-9测试。

答案 1 :(得分:1)

您没有正确检查您的情况:

if (line[count]>= 'A')&& (line[count]<='Z)
  ..

已经转换字符'Z'。下一次检查,

if (line [count]== 'A')putchar('Z');

永远不会执行。但这不是唯一错误的地方。字符'A'应翻译为'B',而不是'Z'。你可能想要

if (line[count]>= 'A' && line[count] < 'Z)

<代替<=)和

if (line [count]== 'Z')putchar('A');

和小写和数字相同。

答案 2 :(得分:0)

问题是scanf的格式字符串。如果要从控制台读取一行文本,则应使用%s

如果您想确保最多读取79个字符,则应使用%79s(因为您的行向量的长度为80)。

所以你应该用这个替换你的scanf:

scanf("%79s", line);