每次尝试接受命令行输入时都会出现分段错误

问题描述 投票:0回答:3

我一直在研究一个程序,它接受一个字符串作为命令行输入并输出由奇数字符组成的字符串是否是回文,但每次我尝试运行它时都会出现分段错误。我整晚都在上班,无法理解。

#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;
}

每次我运行它我都会收到此错误:

分段故障(核心转储)

有谁知道可能导致它的原因?

c segmentation-fault
3个回答
0
投票

一些问题: -

1.strlen将一个字符数组作为输入(char *指针)

  1. 如果在堆栈上使用数组,则必须在编译时知道数组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;
}

1
投票

你的问题

if (isPalindrome(*str1))

由于strchar *类型,在这里,你将一个字符传递给你的isPalindrome()函数,而不是字符串!

不要取消引用你的指针,只需像这样传递它:

if (isPalindrome(str1))

另外,不要忘记启用编译器的警告。您的编译器可以检测到该错误,您可以避免浪费时间调试代码以查找错误。

使用gccclang,使用旗帜-Wall-Wextra


0
投票

*str1是一个char,而不是char数组。所以试试吧

isPalindrome(str1)
© www.soinside.com 2019 - 2024. All rights reserved.