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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每次尝试接受命令行输入时都会出现分段错误相关的知识,希望对你有一定的参考价值。

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

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc == 1) {
        printf("Give a string please
");
        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;
}

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

分段故障(核心转储)

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

答案

一些问题: -

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
");
      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;
}
另一答案

你的问题

if (isPalindrome(*str1))

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

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

if (isPalindrome(str1))

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

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

另一答案

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

isPalindrome(str1)

以上是关于每次尝试接受命令行输入时都会出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

每次运行 iOS 模拟器时都会出现白屏

每次我在 ask-cli v2 中部署我的技能时都会抛出错误

每次 3d 游戏套件项目启动时都会出现 14 个错误 [关闭]

每次上传新文件时都会出现 403 禁止错误

为啥ajax调用在每次调用时都会输入成功和错误块?

每次我尝试在我的 android 设备中运行代码时都会收到此错误。我是应用程序开发的初学者。我正在使用 VScode