Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检查有效Unix FTP命令的程序(不工作)_C_Unix - Fatal编程技术网

C 检查有效Unix FTP命令的程序(不工作)

C 检查有效Unix FTP命令的程序(不工作),c,unix,C,Unix,具体来说,我可以在Unix(Sun Solaris)中编译这个程序,但我无法运行它(我参加了Unix课程,我们所有的程序/作业都要在学校服务器上完成)。他在课程的最后两周才教我们C。我对C相当陌生,不明白为什么它不工作。任何帮助都将不胜感激。我对错误进行了一些研究,但不幸的是,我在网上尝试/找到的方法要么不起作用,要么我做得不好 代码如下 #include <stdio.h> #include <stdlib.h> #include <string.h> #i

具体来说,我可以在Unix(Sun Solaris)中编译这个程序,但我无法运行它(我参加了Unix课程,我们所有的程序/作业都要在学校服务器上完成)。他在课程的最后两周才教我们C。我对C相当陌生,不明白为什么它不工作。任何帮助都将不胜感激。我对错误进行了一些研究,但不幸的是,我在网上尝试/找到的方法要么不起作用,要么我做得不好

代码如下

#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并验证它的命令…让我发布一个工作代码,您可以用它编译并从那里开始。