【发布时间】:2018-08-18 20:07:14
【问题描述】:
我已经搜索并找到了解决方案,但我无法弄清楚为什么我的代码仍然无法正常工作,如果我理解正确,我的 check2 字符串没有'\0'。 我正在使用视觉工作室 我知道有一种更好的写作方法和简短的方法,但只是尝试练习一些事情并尝试更加努力地做到这一点。 我是 C 新手,所以不要评判我:P 这是我的代码:
#include <stdio.h>
#include <string.h>
/*
A palindrome is a string that is same in both forward and backward reading.
Example:
"madam"
"racecar"
"a man a plan a canal panama"
"radar"
You will write a program that will test if a given string is a palingdrome or not.
Your program will ask the user to input a string and if the string is a palindrome program
will just print "Yes, it is a Palindrome", otherwise will print "No, not a Palindrome".
Please note that:
1. Your you need to check in case-insensitive way, that means: Madam or madam both should be
detected as Palindrome.
2. There can be (any number of ) spaces in between the words.
"A man a plan a canal panama"
OR
"A man a pla n a cana l Panama"
both the strings must be detected as Palindrome.
3.There can be punctuations in between the words, for this assignments,
we consider only 4 punctuations, . ? ! and ,
Your program will just need to ignore them (treat them as space).
"Cigar? Toss it in a can. It is so tragic."
Should be detected as palindrome.
*** For this assignment I will not write any instructions or guidance, you are free
to implement it with your own way, you can use the string.h functions
Good luck.
*/
int main(){
char string [100];
printf("Enter a string: ");
scanf("%[^\n]", string);
int isPalindrome = 1; // assign 0 to this if the string is a NOT palindrome
// write code to test if string is a palindrome
char check1[100], check2[100];
int i, j = 0;
for (i = 0; string[i] != '\0'; i++, j++)
{
if ((string[i] >= 'A' && string[i] <= 'Z') || (string[i] >= 'a' && string[i] <= 'z'))
{
check1[i] = string[i];
}
}
check1[i] = '\0';
for (i = strlen(string); i < 0; i--)
{
if ((string[i] >= 'A' && string[i] <= 'Z') || (string[i] >= 'a' && string[i] <= 'z'))
{
check2[i] = string[i];
}
}
i = strlen(string);
check2[i] = '\0';
for (i = 0; check1[i] != '\0'; i++)
{
if ((check1[i] >= 65) && (check1[i] <= 90))
check1[i] = check1[i] + 32;
}
for (i = 0; check2[i] != '\0'; i++)
{
if ((check2[i] >= 65) && (check2[i] <= 90))
check2[i] = check2[i] + 32;
}
printf("%s\n", check1);
printf("%s\n", check2);
isPalindrome = strcmp(check1, check2);
// at the end you need to test
if (isPalindrome){
printf("Yes, it is Palindrome!\n");
}
else{
printf("No, not a Palindrome\n");
}
return 0;
}
这是我的输出:
Enter a string: MadaM
madam
╠╠╠╠╠
Yes, it is Palindrome!
Press any key to continue . . .
好的,现在我的代码如下所示:
#include <stdio.h>
#include <string.h>
/*
A palindrome is a string that is same in both forward and backward reading.
Example:
"madam"
"racecar"
"a man a plan a canal panama"
"radar"
You will write a program that will test if a given string is a palingdrome or not.
Your program will ask the user to input a string and if the string is a palindrome program
will just print "Yes, it is a Palindrome", otherwise will print "No, not a Palindrome".
Please note that:
1. Your you need to check in case-insensitive way, that means: Madam or madam both should be
detected as Palindrome.
2. There can be (any number of ) spaces in between the words.
"A man a plan a canal panama"
OR
"A man a pla n a cana l Panama"
both the strings must be detected as Palindrome.
3.There can be punctuations in between the words, for this assignments,
we consider only 4 punctuations, . ? ! and ,
Your program will just need to ignore them (treat them as space).
"Cigar? Toss it in a can. It is so tragic."
Should be detected as palindrome.
*** For this assignment I will not write any instructions or guidance, you are free
to implement it with your own way, you can use the string.h functions
Good luck.
*/
int main(){
char string [100];
printf("Enter a string: ");
scanf("%[^\n]", string);
int isPalindrome = 1; // assign 0 to this if the string is a NOT palindrome
// write code to test if string is a palindrome
char check1[100], check2[100];
int i, j, dess = 0, len;
for (i = 0; string[i] != '\0'; i++)
{
if ((string[i] >= 'A' && string[i] <= 'Z') || (string[i] >= 'a' && string[i] <= 'z'))
{
check1[dess++] = string[i];
}
}
check1[dess] = '\0';
/*
len = strlen(string);
for (j = 0, i = 0; j < len; j++)
{
if ((string[j] >= 'A' && string[j] <= 'Z') || (string[j] >= 'a' && string[j] <= 'z'))
{
check2[i++] = string[len - j];
}
}
*/
for (dess = 0, i = strlen(string) - 1; i >= 0; i--)
{
if ((string[i] >= 'A' && string[i] <= 'Z') || (string[i] >= 'a' && string[i] <= 'z'))
{
check2[dess++] = string[i];
}
}
check2[dess] = '\0';
for (i = 0; check1[i] != '\0'; i++)
{
if ((check1[i] >= 65) && (check1[i] <= 90))
check1[i] = check1[i] + 32;
}
for (i = 0; check2[i] != '\0'; i++)
{
if ((check2[i] >= 65) && (check2[i] <= 90))
check2[i] = check2[i] + 32;
}
printf("%s\n", check1);
printf("%s\n", check2);
for (i = 0; check1[i] != '\0'; i++)
{
printf("%c\n", check1[i]);
}
for (i = 0; check2[i] != '\0'; i++)
{
printf("%c\n", check2[i]);
}
isPalindrome = strcmp(check1, check2);
// at the end you need to test
if (isPalindrome){
printf("Yes, it is Palindrome!\n");
}
else{
printf("No, not a Palindrome\n");
}
return 0;
}
但我的输出是:
Enter a string: MadaM
madam
madam
m
a
d
a
m
m
a
d
a
m
No, not a Palindrome
Press any key to continue . . .
为什么说它不是回文?
【问题讨论】:
-
for (i = strlen(string); i < 0; i--)从不执行:i<0条件错误。应该是i>=0。并且应该从strlen(string)-1开始 -
╠╠╠╠╠是一个神奇的数字,表示代码中存在某种广泛传播的错误。有一个重复的问题,我现在找不到。 -
啊,我想你在这里找这个问题@Yummosch stackoverflow.com/questions/34931221/…
-
症状相同,原因不同。
-
╠ 在代码页 437 中为 0xCC,MSVC fills 0xCC to uninitialized memory to help debugging。这意味着您访问了未初始化的内存。你可以在这里找到关于 ╠ 和 0xCC 的大量问题
标签: c palindrome