好了,现在这不是我的目标,让这个程序工作,但我不明白为什么它将奇怪的字符存储到数组中,而不是输入到终端中的字符。
这是我运行程序时得到的结果......
输入信息:他是一个魔鬼,呃?
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;
}
答案 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)
首先,您可以使用isupper
或isalpha
来检查大写字母或字母字符。
你得到奇怪的角色,因为你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;
}
}