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

C 指针字符数组可以工作,但打印时输出错误的字符,c,arrays,pointers,character,C,Arrays,Pointers,Character,好了,现在这对于我让这个程序工作的目标来说不是必须的,但是我不明白为什么它将奇怪的字符存储到数组中,而不是在终端中键入的字符 这是我运行程序时得到的结果 输入一条信息:他像魔鬼一样生活,是吗 他(╠ ( ═▓!u·ñ∑■jX 回文的 进程返回0(0x0)执行时间:21.120秒 按任意键继续 输入消息:女士,我是亚当 女士:,╠ ( ═▓!U┴:» 不是回文 进程返回0(0x0)执行时间:9.039秒 按任意键继续 如你所见,它是有效的^ // Chapter 12 Programmi

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

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

输入一条信息:他像魔鬼一样生活,是吗

他(╠ ( ═▓!u·ñ∑■jX

回文的

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


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

女士:,╠ ( ═▓!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;
    }
//第12章编程项目#2
#包括
#包括
#包括
#定义N 50
bool chk_msg(字符消息[],字符*j);
内部主(空)
{
char-msg[N],*p;
int-chk=0;
printf(“输入消息:”);
对于(p=&msg[0];p<&msg[N];){
*p=toupper(getchar());

如果(((int)*p>=65)和((int)*pC中的字符串以
'\0'
结尾,则称为终止符。您从未添加终止符,因此字符串只会运行到随机内存中。在处理该断开的字符串时,代码的行为未定义


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

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

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

如果((int)*p>=65)和((int)*p=65)和((int)*p您的消息读取功能非常混乱:

这项工作:

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;
    }
}
首先,您可以使用或检查大写或字母字符

你会得到奇怪的字符,因为你
printf(“%c”,msg[chk++]);
。你增加
chk
,不管你之前是否插入了字符

当您将
printf
移动到第一个
if
内时,它应能正常工作

if (isupper(*p)) {
    p++;
    printf("%c", msg[chk++]);
} else if (*p == '\n')
    break;
一个小优化:您可以将
chk_msg
中的比较移动到
中,以获得退出条件

for (i = msg, j--; i < j; i++, j--) {
    if (*i != *j)
        palindrome = false;
}
for(i=msg,j--;i
再次感谢大家的投入和帮助

    // 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;
        }
    }
//第12章编程项目#2
#包括
#包括
#包括
#定义N 50
bool chk_msg(字符消息[],字符*j);
内部主(空)
{
char msg[N]=“”,*p;
int-chk=0;
printf(“输入消息:”);
对于(p=&msg[0];p<&msg[N];){
*p=toupper(getchar());
如果(isalpha(*p)){
p++;
printf(“%c”,msg[chk++]);
}else if(*p=='\n'){
打破
}
}
printf(“\n”);
如果(chk_msg(msg,p))
printf(“回文\n\n”);
其他的
printf(“不是回文\n\n”);
返回0;
}
bool chk_msg(char msg[],char*j)
{
char*i;
对于(i=&msg[0],j--;i<&msg[N];i++,j--){
如果(i==j)
返回true;
else if(*i!=*j)
返回=假;
}
}

另一个很好的例子,说明了不初始化变量可能会导致严重的不适。提示:C-“字符串”需要以零结尾,因此在使用它们之前,最好先用
0
s填充缓冲区:
char msg[N]=“”
好的,谢谢@alk我会检查一下谢谢你提供的信息,非常感谢。我忘记了isalpha(),因为我在这本书中只使用了两次。谢谢@OlafDietsche,这对我帮助很大,信息量也非常大。我改变了所有这些,现在它工作得很好。
for (i = msg, j--; i < j; i++, j--) {
    if (*i != *j)
        palindrome = false;
}
    // 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;
        }
    }