C - 检查字符串相等性

时间:2015-11-29 17:03:54

标签: c string arguments

运行程序后我一直收到错误。 错误是“分段错误(核心转储)”,我得到一个注释。

note: expected ‘const char *’ but argument is of type ‘char’
 extern int strcmp (const char *__s1, const char *__s2)

这是我的代码:

int main()
{
  char cmdline[100];
  printf ("esp> ");
  fgets( cmdline, sizeof( cmdline ), stdin );

  char *args[4] = { NULL };
  char *pchcaus;

  pchcaus = strtok (cmdline," ");

  int i = 0;
  while (pchcaus != NULL)
  {
    args[i++] = pchcaus;
    pchcaus = strtok (NULL, " ");
  }

  char* command = args[0];
  char* argumentOne = args[1];
  char* argumentTwo = args[2];
  char* input = { "quit" };

  printf ("%s", command);    // this prints "quit"

  if (strcmp(command, input) == 0) {  // this is not working. why ?
    printf("Bye.\n" );
  }

  return 0;
}

如果我输入quit,则返回“Segmentation fault(core dumped)”。其他一切都在起作用,但是如果声明的话。比较字符串

的那个

2 个答案:

答案 0 :(得分:2)

问题的根源有两个:

1)这种初始化不太理想:

char* input = {"quit"};

建议:

char* input = "quit";

2)fgets()函数输入尾随<newline><newline>需要修剪

输入'退出'的实际结果是:

"quit\n"

建议,在致电fgets()之后插入此内容:

char *NewLine = NULL;
if( NULL != (NewLine = strstr( cmdline, "\n" ) ) )
{
     *NewLine = '\0';
}

代码还应检查(!= NULL)来自fgets()的返回值,以确保输入操作成功

答案 1 :(得分:0)

我认为问题是input应该定义为char* input[] = { "quit" };,条件应该是strcmp(command, input[0]) == 0

input应定义为char* input = "quit";,条件可以保留为您的示例。

在您的示例中,input被声明为char**,但在char*中用作strcmp。这在警告......

中说明

但是虽然它确实是一个错误,但我无法解释Segmentation fault错误。这意味着代码尝试读取(或写入)错误的地址(不在用户地址空间中的代码)。但在你的情况下,输入只是指向堆栈上指针的指针(它指向初始化数据段中的一个char数组,其中包含五个字节:&#39; q&#39;,&#39; u&#39; ,&#39;我&#39;,&#39;&#39; \#39; \ 0&#39;)。所以我不得不考虑一下......