每次尝试接受命令行输入时都会出现分段错误
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 *
指针)
- 如果在堆栈上使用数组,则必须在编译时知道数组
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))
由于str
是char *
类型,在这里,你将一个字符传递给你的isPalindrome()
函数,而不是字符串!
解
不要取消引用你的指针,只需像这样传递它:
if (isPalindrome(str1))
另外,不要忘记启用编译器的警告。您的编译器可以检测到该错误,您可以避免浪费时间调试代码以查找错误。
使用gcc
和clang
,使用旗帜-Wall
和-Wextra
。
另一答案
*str1
是一个char,而不是char数组。所以试试吧
isPalindrome(str1)
以上是关于每次尝试接受命令行输入时都会出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章
每次我在 ask-cli v2 中部署我的技能时都会抛出错误