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

时间:2018-03-05 11:48:51

标签: c segmentation-fault

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

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

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

  

分段错误(核心转储)

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

3 个答案:

答案 0 :(得分:1)

您的问题

if (isPalindrome(*str1))

由于strchar *类型,因此您将字符传递给isPalindrome()函数,而不是字符串!

解决方案

不要取消引用指针,只需将其传递给它:

if (isPalindrome(str1))

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

使用gccclang,使用标记-Wall-Wextra

答案 1 :(得分:0)

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

isPalindrome(str1)

答案 2 :(得分:0)

一些问题: -

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

  1. 如果是,则必须在编译时知道数组oddStr的大小 在堆栈上使用。否则它应该通过
    在堆上创建 malloc
  2. 请在下面找到正确的工作代码: -

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