在C程序中使用printf打印时添加到我的字符字符串的未定义行为(额外符号)

在C程序中使用printf打印时添加到我的字符字符串的未定义行为(额外符号),c,struct,towers-of-hanoi,C,Struct,Towers Of Hanoi,我写这个程序是为了帮助别人,也是为了学习,但现在我不明白为什么会有这种奇怪的附加功能?非常感谢您的帮助 #include <stdio.h> #include <ctype.h> typedef struct { char str[1000]; } arrType; typedef struct { char *str; } ptrType; ptrType message = {"start"}; int main() {

我写这个程序是为了帮助别人,也是为了学习,但现在我不明白为什么会有这种奇怪的附加功能?非常感谢您的帮助

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

typedef struct
{
    char str[1000];
} arrType;

typedef struct
{
    char *str;
} ptrType;

ptrType message = {"start"};

int main()
{
    int choice;
    int i;
    char temp;
    char begmessage[1000];
    char endmessage[1000];
    printf("Would you like to (1) encrypt or (2) decrypt?: ");
    scanf("%i", &choice);
    scanf("%c", &temp); // temp statement to clear buffer
    printf("You chose: %d\n", choice);
    printf("Type your message: ");
    scanf("%[^\n]", begmessage);
    ptrType message = {begmessage};
    printf("\nThe message you typed is %s \n", message.str);
    if (choice == 1) 
    {
        for (i = 0; (i < 1000 && message.str[i] != '\0');) 
        {
            if (isalnum(message.str[i])) 
            {
                endmessage[i] = putchar((message.str[i] + 1));
                i +=1;
            } 
            else 
            {
                endmessage[i] = putchar((message.str[i])); i +=1;
            }
        }
    printf("\nYour message is now: %s\n", endmessage);
    }
    if (choice == 2) {
        for (i = 0; (i < 1000 && message.str[i] != '\0');) 
        {
            if (isalnum(message.str[i])) 
            {
                endmessage[i] = putchar((message.str[i] - 1));
                i +=1;
            } 
            else 
            {
                endmessage[i] = putchar((message.str[i])); i +=1;
            }
        }
    printf("\nYour message is now: %s\n", endmessage);

    } 

}
#包括
#包括
类型定义结构
{
char-str[1000];
}棱型;
类型定义结构
{
char*str;
}ptrType;
ptrType消息={“开始”};
int main()
{
智力选择;
int i;
焦炭温度;
char begmessage[1000];
char endmessage[1000];
printf(“您想(1)加密还是(2)解密?:”;
scanf(“%i”和“选择”);
scanf(“%c”,&temp);//清除缓冲区的temp语句
printf(“您选择了:%d\n”,选项);
printf(“键入您的消息:”);
scanf(“%[^\n]”,begmessage);
ptrType message={begmessage};
printf(“\n您键入的消息是%s\n”,message.str);
如果(选项==1)
{
对于(i=0;(i<1000&&message.str[i]!='\0');)
{
if(isalnum(message.str[i]))
{
endmessage[i]=putchar((message.str[i]+1));
i+=1;
} 
其他的
{
endmessage[i]=putchar((message.str[i]);i+=1;
}
}
printf(“\n您的消息现在是:%s\n”,endmessage);
}
如果(选项==2){
对于(i=0;(i<1000&&message.str[i]!='\0');)
{
if(isalnum(message.str[i]))
{
endmessage[i]=putchar((message.str[i]-1));
i+=1;
} 
其他的
{
endmessage[i]=putchar((message.str[i]);i+=1;
}
}
printf(“\n您的消息现在是:%s\n”,endmessage);
} 
}
以下是输出:

您想(1)加密还是(2)解密?:1您选择了:1类型 你的信息:高塔

您键入的消息是High Tower Ijhi Upxfs您的消息现在是: Ijhi-Upxfs���

您想(1)加密还是(2)解密?:2您选择了:2类型 您的信息:Ijhi Upxfs

您键入的消息是Ijhi Upxfs High Tower您的消息现在是: 高塔���

这行“高塔”从哪里来? 在最后一行,这个“���" 我在stackoverflow和互联网上搜索了一下,但是这个符号� 不被承认

再次运行该程序并得到类似的结果:

您想(1)加密还是(2)解密?:1 你选择了:1 键入您的消息:高塔

您键入的消息是High Tower Ijhi Upxfs您的消息现在是: Ijhi-Upxfs�;�

您想(1)加密还是(2)解密?:2您选择了:2类型 您的信息:Ijhi Upxfs

您键入的消息是Ijhi Upxfs High Tower您的消息现在是: 高塔@


您是否曾计划在
endmessage
中设置终止符?C要求您用值
'\0'
指示字符串的结尾。您从未将此字节添加到字符串中,因此在填充的部分后会出现垃圾。这是C字符串最基本的功能之一。非常感谢WhozCraig和Barmar I在main()之前添加了int-end;,这是:end=I;}endmessage[end]=putchar('\0');垃圾消失了,但它仍然在我的printf语句之前打印出结果?因为在每个
if..else..
中,您通过
1
递增
i
,没有理由不在
for
循环的增量中使用
i++
,例如,
for(…;;i++)
。它将使可读性更好。此外,
arrType
ptrType
不需要使用单个成员结构——您可以简单地使用数组或指针——这也将整理语法。