[英]Seg fault when printing string array line, works fine when printed character by character
[英]Pointer character array works, but when printed outputs the wrong characters
好了,這對於實現該程序的目標並不是強制性的,但是我不明白為什么它會將奇怪的字符存儲到數組中來代替在終端中鍵入的字符。
這是我運行程序時得到的...
輸入一條消息:他過着魔鬼的生活,是嗎?
HE(╠(═▓!u·ñΣ■jX
回文
進程返回0(0x0)執行時間:21.120 s按任意鍵繼續。
輸入一條消息:女士,我是亞當。
MADAM,╠(═▓!u┴:»
不是回文
進程返回0(0x0)執行時間:9.039 s按任意鍵繼續。
如您所見,它起作用了^...。
// 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;
}
您正在驗證具有以下條件的輸入字符
if (((int)*p >= 65) && ((int)*p <= 90))
但是在此檢查中,您只允許使用字母(ASCII 65-90),但在輸入中您還輸入空格(ASCII 0x20)。 這就是您的邏輯出錯並在輸出中產生垃圾的原因。
如果您在輸入中還需要空格,請按如下所示更改條件檢查,
if ((((int)*p >= 65) && ((int)*p <= 90)) || ((int)*p == 20))
然后,一切都會好起來的。
C中的字符串以'\\0'
結尾,即所謂的終結符。 您永遠不會添加一個,因此您的字符串只會耗盡到隨機內存中。 處理該損壞的字符串時,您的代碼將獲得未定義的行為。
另外,您絕對不要像這樣對ASCII值進行硬編碼,例如使用isalpha()
進行過濾。
您的消息閱讀功能非常混亂:
這有效:
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;
}
首先,您可以使用isupper
或isalpha
檢查大寫或字母字符。
您會得到奇怪的字符,因為您是printf("%c", msg[chk++]);
。 增加chk
,無論之前是否插入字符。
當您在第一個if
移動printf
if
,它應該可以正常工作
if (isupper(*p)) {
p++;
printf("%c", msg[chk++]);
} else if (*p == '\n')
break;
一個小的優化:您可以將chk_msg
的比較chk_msg
for
退出條件
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.