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