繁体   English   中英

strcmp for循环中的C分段错误

[英]C Segmentation Fault in strcmp for-loop

新手程序员学习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 <= 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永远不会在循环内部发生,如果该条件为true ,则for循环应该中断。 确保在for循环范围之外定义i for以便在for循环中断后可用。

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

将10用作“魔术数”也不是一个好选择:最好让编译器为您计算大小 最后,最好在循环使用index来确定是否已找到命令:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM