C语言 每次尝试命令行输入时都会出现分段错误



我一直在开发一个程序,该程序将一个字符串作为命令行输入并输出由奇数字符组成的字符串是否是回文,但是每次我尝试运行它时,我都会得到分段错误。我彻夜未眠,想不通。

#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))

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

对于gccclang,使用标志-Wall-Wextra

一些问题:-

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 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)

相关内容

  • 没有找到相关文章