C 分段错误 strcmp for 循环



学习 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循环应该在 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);
}

相关内容

  • 没有找到相关文章

最新更新