【问题标题】:C Segmentation Fault in strcmp for-loopstrcmp for循环中的C分段错误
【发布时间】:2017-09-13 06:13:14
【问题描述】:

新手程序员学习 C,我在尝试使用 strcmp 运行 for 循环时遇到此“分段错误(核心转储)”错误。我已经看到有关 strcmp 类似问题的问题,但它们似乎并没有解决我的问题。这是我编写的程序。

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

int main() {
  char ftpstring[15];
  printf("\nEnter valid ftp command > ");
  fgets(ftpstring,15,stdin);

  const char* ftp[] = { "ascii", "recv", "send", "rmdir", "mkdir" , "pwd", "ls", "cd", "status", "quit" };

  for ( int i = 0; i <= 10; i++ ) {
    int comparison;
    comparison = strcmp(ftpstring, ftp[i]);
    if (comparison == 0 ) {
      printf("%s is a valid ftp command.", ftpstring);
      break;
    }
    if(i == 10) {
      printf("%s is NOT a valid ftp command.", ftpstring);
    }
  }
}

如您所见,该程序尝试读取用户输入以确定它是否匹配预定义的有效 ftp 命令之一,然后返回是否匹配。

【问题讨论】:

  • for ( int i = 0; i &lt;= 10; i++ ) 应该是for ( int i = 0; i &lt; 10; i++ )

标签: c segmentation-fault strcmp


【解决方案1】:

for ( int i = 0; i &lt;= 10; i++ ) 应该是for ( int i = 0; i &lt; 10; i++ )

ftp 数组包含 10 个字符串,因此循环应该是从 09 包括在内。

更通用的解决方案可能是

for ( int i = 0; i < sizeof(ftp)/sizeof(ftp[0]); i++ )

但最好定义一个宏

#define FTP_NUM_OF_COMMANDS 10

并定义ftp数组如下:

const char* ftp[FTP_NUM_OF_COMMANDS] = { "ascii", "recv", "send", "rmdir", "mkdir" , "pwd", "ls", "cd", "status", "quit" };

在这种情况下,编译器还将验证您没有(错误地)使用超过 10 个值对其进行初始化。 for 循环将如下所示:

for ( int i = 0; i < FTP_NUM_OF_COMMANDS; i++ )

还要注意以下代码应该移到for循环之外

if(i == FTP_NUM_OF_COMMANDS) {
  printf("%s is NOT a valid ftp command.", ftpstring);
}

i==FTP_NUM_OF_COMMANDS 永远不会出现在循环内部,如果条件是truefor 循环应该会中断。确保在for 循环范围之外定义i,以便在for 循环中断后可用。

【讨论】:

  • 最好是sizeof(ftp)/sizeof(ftp[0])——因为如果您没有注意到这一行,您可以更改ftp 中元素的大小或类型而不会导致错误。
  • @gilez 同意!已编辑。谢谢!
  • 只是说,我宁愿写for (int i = 0; ftp[i] != NULL; i++)
  • @ale-batt 这将是一个错误。没有任何东西可以保证ftp [10] 将始终为 0 (NULL)。
  • 你说得对,只是我习惯用 NULL 结尾的数组
【解决方案2】:

您正在对数组末尾进行比较:for 循环应在 9 处停止,而您的循环应超出数组末尾。

使用 10 作为“幻数”也不是一个好的选择:最好使用compiler compute the size for you。最后,最好在循环之后使用 index after 来判断命令是否被找到:

int index = -1;
for ( int i = 0 ; i != sizeof(ftp) / sizeof(*ftp) ; i++ ) {
    if (!strcmp(ftpstring, ftp[i])) {
        index = i;
        break;
    }
}
if (index == -1) {
    printf("%s is NOT a valid ftp command.", ftpstring);
}

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2011-11-11
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多