我一直在开发一个程序,该程序将一个字符串作为命令行输入并输出由奇数字符组成的字符串是否是回文,但是每次我尝试运行它时,我都会得到分段错误。我彻夜未眠,想不通。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc == 1) {
printf("Give a string pleasen");
return 0;
}
//char *ptr1;
//ptr1 = malloc(sizeof(char)*100);
//int memSize = strlen(argv[1]);
//leftovers from previous attempts I may get back to
char *str1 = argv[1];
if (isPalindrome(*str1))
printf("it is a palindrome");
else
printf("not a palindrome");
}
int isPalindrome(char str[])
{
char oddStr[sizeof(char)*50];
int j = 0;
for (int i = 0; i < strlen(*str); i++) {
if(i%2 == 1) {
oddStr[j] = str[i];
j++;
}
}
int i = 0;
int k = strlen(&oddStr) - 1;
while (k > i) {
if (oddStr[i++] != oddStr[k--])
return 0;
}
return 1;
}
每次运行它时都会收到此错误:
分段故障(核心转储(
有谁知道可能是什么原因造成的?
你的问题
if (isPalindrome(*str1))
由于str
是一个类型char *
,在这里,你传递一个字符给你的isPalindrome()
函数,而不是一个字符串!
溶液
不要取消引用你的指针,只需像这样传递它:
if (isPalindrome(str1))
另外,不要忘记启用编译器的警告。编译器可以检测到该错误,您将避免浪费时间调试代码以查找错误。
对于gcc
和clang
,使用标志-Wall
和-Wextra
。
一些问题:-
1. strlen
将字符数组作为输入(char *
指针(
- 数组
oddStr
的大小必须在编译时知道,如果它是在堆栈上使用。否则,它应该通过以下方式在
堆上创建malloc
.
请在下面找到正确的工作代码:-
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main (int argc, char *argv[])
{
if (argc == 1)
{
printf ("Give a string pleasen");
return 0;
}
char *str1 = argv[1];
if (isPalindrome (str1))
printf ("it is a palindrome");
else
printf ("not a palindrome");
}
int isPalindrome (char str[])
{
//char oddStr[sizeof (char) * 50];
char * oddStr = (char *)malloc(sizeof (char) * 50);
int j = 0;
for (int i = 0; i < strlen(str); i++)
{
if (i % 2 == 1)
{
oddStr[j] = str[i];
j++;
}
}
int i = 0;
int k = strlen (oddStr) - 1;
while (k > i)
{
if (oddStr[i++] != oddStr[k--])
{
return 0;
}
}
return 1;
}
*str1
是一个字符,而不是一个字符数组。所以试试这个
isPalindrome(str1)