我一直在研究一个程序,它接受一个字符串作为命令行输入并输出由奇数字符组成的字符串是否是回文,但每次我尝试运行它时都会出现分段错误。我整晚都在上班,无法弄明白。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc == 1) {
printf("Give a string please\n");
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;
}
每次我运行它都会收到此错误:
分段错误(核心转储)
有谁知道可能导致它的原因?
答案 0 :(得分:1)
if (isPalindrome(*str1))
由于str
是char *
类型,因此您将字符传递给isPalindrome()
函数,而不是字符串!
不要取消引用指针,只需将其传递给它:
if (isPalindrome(str1))
此外,不要忘记启用编译器的警告。编译器可以检测到这个错误,您可以避免浪费时间调试代码来查找错误。
使用gcc
和clang
,使用标记-Wall
和-Wextra
。
答案 1 :(得分:0)
*str1
是一个char,而不是char数组。所以试试这个
isPalindrome(str1)
答案 2 :(得分:0)
一些问题: -
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 please\n");
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;
}