strcmp for-loop中的C分段错误

时间:2017-04-17 15:43:08

标签: c segmentation-fault strcmp

新手程序员学习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命令匹配,然后返回它是否有。

2 个答案:

答案 0 :(得分:1)

for ( int i = 0; i <= 10; i++ )应为for ( int i = 0; i < 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循环应该会中断。确保在i循环范围之外定义for,以便在for循环中断后可用。

答案 1 :(得分:0)

你在数组末尾进行比较: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); } 循环应该停在9,而你的循环超过数组的末尾。

使用10作为&#34;幻数&#34;也不是一个好的选择:拥有compiler compute the size for you要好得多。最后,最好在循环之后使用索引来确定是否找到了命令:

{{1}}