指针字符数组工作,但打印时输出错误的字符

时间:2014-05-14 09:06:29

标签: c arrays pointers character

好了,现在这不是我的目标,让这个程序工作,但我不明白为什么它将奇怪的字符存储到数组中,而不是输入到终端中的字符。

这是我运行程序时得到的结果......

输入信息:他是一个魔鬼,呃?

HE(╠(═▓!u·ñΣ■jX

回文

进程返回0(0x0)执行时间:21.120秒 按任意键继续。


输入消息:女士,我是亚当。

MADAM,╠(═▓!u┴:»

不是回文

进程返回0(0x0)执行时间:9.039秒 按任意键继续。

正如你所看到的那样有效...... ^ /

    // Chapter 12 Programming Project #2

    #include <stdio.h>
    #include <ctype.h>
    #include <stdbool.h>

    #define N 50

    bool chk_msg(char message[],char *j);

    int main(void)
    {
        char msg[N], *p;
        int chk = 0;

        printf("Enter a message: ");
        for (p = &msg[0]; p < &msg[N];) {
            *p = toupper(getchar());
            if (((int)*p >= 65) && ((int)*p <= 90)) {
                p++;
            } else if (*p == '\n')
                break;
            printf("%c", msg[chk++]);
        }
        printf("\n");

        if (chk_msg(msg, p))
            printf("Palindrome\n\n");
        else
            printf("Not a palindrome\n\n");

        return 0;
    }

    bool chk_msg(char msg[], char *j)
    {
        char *i;
        bool palindrome = true;

        for (i = &msg[0], j--; i < &msg[N]; i++, j--) {
            if (i == j)
                break;
            else if (*i != *j)
                palindrome = false;
        }

        return palindrome;
    }

5 个答案:

答案 0 :(得分:1)

您正在使用以下条件验证输入字符

if (((int)*p >= 65) && ((int)*p <= 90))

但在此检查中,您只允许使用字母(ASCII 65 - 90),但在输入中您还输入空格(ASCII 0x20)。这就是你的逻辑出错并导致输出中出现垃圾的原因。

如果您的输入中还需要空格,请更改条件检查,如下所示

if ((((int)*p >= 65) && ((int)*p <= 90)) || ((int)*p == 20))

然后一切都会好起来的。

答案 1 :(得分:0)

C中的字符串以'\0'结尾,即所谓的终结符。你永远不会添加一个,所以你的字符串只会运行到随机内存中。处理那个破碎的字符串时,你的代码会得到未定义的行为。

此外,您不应该像这样硬编码ASCII值,例如使用isalpha()来过滤。

答案 2 :(得分:0)

你的留言阅读功能很乱:

这有效:

for (p = &msg[0]; p < &msg[N];) {
    char c = toupper(getchar());

    if ((c >= 'A') && (c <= 'Z')) {  // filter out anything not between A and Z
        *p++ = c;
        printf("%c", c);
    }
    else if (c == '\n') {
        *p = 0 ;              // put the zero terminator
        break;
    }
}

修改

你的chk_msg也错了,过于复杂。

这是更正版本:

bool chk_msg(char msg[], char *j)
{
    char *i;

    for (i = &msg[0], j--; i < j; i++, j--) {
       if (*i != *j) {
         return true ;
       }
    }

    return false;
}

答案 3 :(得分:0)

首先,您可以使用isupperisalpha来检查大写字母或字母字符。

你得到奇怪的角色,因为你printf("%c", msg[chk++]);。无论您之前是否插入过字符,都会增加chk

当您将printf移到第一个if内时,它应按预期工作

if (isupper(*p)) {
    p++;
    printf("%c", msg[chk++]);
} else if (*p == '\n')
    break;

小优化:您可以将chk_msg中的比较移至for退出条件

for (i = msg, j--; i < j; i++, j--) {
    if (*i != *j)
        palindrome = false;
}

答案 4 :(得分:0)

再次感谢大家的意见和帮助

    // Chapter 12 Programming Project #2

    #include <stdio.h>
    #include <ctype.h>
    #include <stdbool.h>

    #define N 50

    bool chk_msg(char message[],char *j);

    int main(void)
    {
        char msg[N] = "", *p;
        int chk = 0;

        printf("Enter a message: ");
        for (p = &msg[0]; p < &msg[N];) {
            *p = toupper(getchar());
            if (isalpha(*p)) {
                p++;
                printf("%c", msg[chk++]);
            } else if (*p == '\n') {
                break;
            }
        }
        printf("\n");
        if (chk_msg(msg, p))
            printf("Palindrome\n\n");
        else
            printf("Not a palindrome\n\n");

        return 0;
    }

    bool chk_msg(char msg[], char *j)
    {
        char *i;

        for (i = &msg[0], j--; i < &msg[N]; i++, j--) {
            if (i == j)
                return true;
            else if (*i != *j)
                return = false;
        }
    }