C 检查有效Unix FTP命令的程序(不工作)
具体来说,我可以在Unix(Sun Solaris)中编译这个程序,但我无法运行它(我参加了Unix课程,我们所有的程序/作业都要在学校服务器上完成)。他在课程的最后两周才教我们C。我对C相当陌生,不明白为什么它不工作。任何帮助都将不胜感激。我对错误进行了一些研究,但不幸的是,我在网上尝试/找到的方法要么不起作用,要么我做得不好 代码如下C 检查有效Unix FTP命令的程序(不工作),c,unix,C,Unix,具体来说,我可以在Unix(Sun Solaris)中编译这个程序,但我无法运行它(我参加了Unix课程,我们所有的程序/作业都要在学校服务器上完成)。他在课程的最后两周才教我们C。我对C相当陌生,不明白为什么它不工作。任何帮助都将不胜感激。我对错误进行了一些研究,但不幸的是,我在网上尝试/找到的方法要么不起作用,要么我做得不好 代码如下 #include <stdio.h> #include <stdlib.h> #include <string.h> #i
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
char** splitString(char* inputString, const char delim) {
char** output = 0;
size_t c = 0;
char* temp = inputString;
char* final_space = 0;
char delimiter[2];
delimiter[0] = delim;
delimiter[1] = 0;
while(*temp) {
if(delim == *temp) {
c++;
final_space = temp;
}
temp++;
}
c += final_space < (inputString + strlen(inputString) - 1);
c++;
output = malloc(sizeof(char*) * c);
if(output) {
size_t index = 0;
char* output = strtok(inputString, delimiter);
while(output) {
assert(index < c);
*(output + index++) = strdup(output);
output = strtok(0, delimiter);
}
assert(index == c - 1);
*(output + index) = 0;
}
return output;
}
void main() {
char input[50];
char** splitInput = NULL;
int rs;
printf("please enter a Unix FTP cmd. The program will check to see if it is a valid cmd: ");
gets(input);
splitInput = splitString(input, ' ');
printf("input[%s]", *(splitInput));
rs = strcmp(*(splitInput), "ascii");
if(rs == 0) {
printf("ascii is a valid ftp command\n");
return;
}
rs = strcmp(*(splitInput), "recv");
if(rs == 0) {
printf("recv is a valid ftp command\n");
free(splitInput);
printf("the entered cmd is %s", *(splitInput + 1));
return;
}
rs = strcmp(*(splitInput), "get");
if(rs == 0) {
printf("get is a valid ftp command\n");
free(splitInput);
printf("the entered cmd is %s", *(splitInput + 1));
return;
}
rs = strcmp(*(splitInput), "send");
if(rs == 0) {
printf("send is a valid ftp command\n");
free(splitInput);
printf("the entered cmd is %s", *(splitInput + 1));
return;
}
rs = strcmp(*(splitInput), "put");
if(rs == 0) {
printf("put is a real Unix FTP cmd\n");
free(splitInput);
printf("the entered cmd is %s", *(splitInput + 1));
return;
}
rs = strcmp(*(splitInput), "rmdir");
if(rs == 0) {
printf("rmdir is a real Unix FTP cmd\n");
printf("the entered cmd is %s", *(splitInput + 1));
return;
}
rs = strcmp(*(splitInput), "mkdir");
if(rs == 0) {
printf("mkdir is a real Unix FTP cmd\n");
free(splitInput);
printf("the entered cmd is %s", *(splitInput + 1));
return;
}
rs = strcmp(*(splitInput), "rmdir");
if(rs == 0) {
printf("rmdir is a real Unix FTP cmd\n");
free(splitInput);
printf("the entered cmd is %s", *(splitInput + 1));
return;
}
rs = strcmp(*(splitInput), "ls");
if(rs == 0) {
printf("ls a real Unix FTP cmd\n");
free(splitInput);
printf("the entered cmd is %s", *(splitInput + 1));
return;
}
rs = strcmp(*(splitInput), "cd");
if(rs == 0) {
printf("cd is a real Unix FTP cmd\n");
free(splitInput);
printf("the entered cmd is %s", *(splitInput + 1));
return;
}
rs = strcmp(*(splitInput), "status");
if(rs == 0) {
printf("status is a valid ftp command\n");
return;
}
rs = strcmp(*(splitInput), "quit");
if(rs == 0) {
printf("quit is a valid ftp command\n");
return;
} else {
printf(*(splitInput), " isn't a real Unix FTP cmd");
}
return;
}
#包括
#包括
#包括
#include当指针正在访问未分配给的空间中的内存时,您将遇到分段错误。正如布鲁塞格所指出的,这条线路肯定是造成这次撞车的原因,而且在那之后可能会更多
如果您的代码只是为了验证ftp命令,那么您可以简单地使用strok或strok\r执行以下操作,运行“manstrok”查看详细信息和示例
这是您可以编译和运行的代码,您可以从这里完成其余的工作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
char input[50];
int i;
char *token,*str,*cmd[2],*ptr;
printf("please enter a Unix FTP cmd. The program will check to see if it is a valid cmd: ");
fgets(input,50,stdin);
input[strlen(input)-1]='\0';
for (i=0,str=input;;i++,str=NULL) {
token=strtok_r(str," ",&ptr);
if (token==NULL) {
break;
}
cmd[i]=token;
}
printf("(%s)\n",cmd[0]);
if (!strcmp(cmd[0],"ascii")) {
printf("ascii is a valid ftp command\n");
}
else if (!strcmp(cmd[0],"get")) {
printf("get is a valid ftp command\n");
printf("the entered cmd is: %s %s\n",cmd[0],cmd[1]);
}
}
#包括
#包括
#包括
void main(){
字符输入[50];
int i;
char*token、*str、*cmd[2]、*ptr;
printf(“请输入Unix FTP cmd。程序将检查它是否是有效的cmd:”;
fgets(输入,50,标准输入);
输入[strlen(输入)-1]='\0';
for(i=0,str=input;;i++,str=NULL){
令牌=strtok_r(str,“,&ptr);
如果(令牌==NULL){
打破
}
cmd[i]=令牌;
}
printf((%s)\n),cmd[0]);
如果(!strcmp(cmd[0],“ascii”)){
printf(“ascii是有效的ftp命令\n”);
}
否则如果(!strcmp(cmd[0],“get”)){
printf(“get是有效的ftp命令\n”);
printf(“输入的命令是:%s%s\n”,命令[0],命令[1]);
}
}
顺便说一句,你应该能够在学校实验室外用gcc在mac或linux上完成这项工作。如果您在Windows上,在cygwin中安装gcc是一种快捷的方法。您的代码将在学校的solaris服务器上编译。希望这有帮助。您尝试过使用调试器吗?这是一个重要的工具,应该是你提问前的第一站。你的问题不是关于C,而是一堆代码垃圾。可能还有其他问题,但我确信这行是错误的:*(输出+索引++)=strdup(输出)代码>strdup生成字符串输出的副本,您试图将其分配到由单个字符值指定的位置。这肯定会导致崩溃。while(*temp){
for()你听说过吗
循环?它们可能很方便。我不知道如何实现您给我的代码,无论我尝试哪种方式都会导致错误。不过,我确实将它放入了调试器中,调试器在第46行和第61行给了我错误。这是我在代码中使用的调试器控制台:我得到的错误截图:使用指针的方式有很多问题需要修复…a似乎没有必要仅仅模拟ftp并验证它的命令…让我发布一个工作代码,您可以用它编译并从那里开始。