在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
不需要使用单个成员结构——您可以简单地使用数组或指针——这也将整理语法。