C - scanf表现得很奇怪

时间:2017-02-14 02:17:18

标签: c scanf

我正在开发一个简单的c程序,它接受一个命令并运行一个简单的C函数,因此你不必编译整个程序就可以看到它的工作原理。在{I}尝试接受输入时scanf工作正常。我想要有效率,首先按空格分割输入,我在上面做了一个函数。然后让if语句比较第一项,即命令名。但每当我运行它时,当它开始创建多个新行并打印出输入的文本时,它表现得很奇怪。我希望它将分割文本的第一项存储在变量中并打印第一项,而是按顺序打印出每个项目。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void displayHeader(){
    printf("SuperCMD version 1.3. \nType \"help\" for a list of commands.\n");
}
char * strspltf(char * str, char * delim, int index){
    char * pch = strtok(str, delim);
    int i = 0;
    while(pch != NULL){
        if(i == index){
            return pch;
        }
        pch = strtok(NULL, delim);
        i++;
    }
    return NULL;
}

int main(){
    displayHeader();
    char command[] = "";
    char dir[] = "C:\\";
    while(strcmp(command, "exit") != 0){
        printf("%s > ", dir);
        scanf("%s", command);
        char * res = strspltf(command, " ", 0);
        printf("%s\n", strspltf(command, " ", 0));
    }
    return 0;
}

top上的函数返回由另一个字符串拆分的字符串的特定索引。有人能告诉我我做错了什么以及如何解决它?此外,当我键入“退出”时,它崩溃了。为什么?

2 个答案:

答案 0 :(得分:1)

此:

char command[] = "";

错了。除了一个空字符串之外,您没有为数组分配和空间。然后调用scanf("%s", command);,因为没有分配内存来保存scanf的结果,你用垃圾覆盖堆栈。将声明更改为:

#define MAX_COMMAND 50   // or whatever size you need.
char command[MAX_COMMAND];

...

答案 1 :(得分:1)

您的本地变量command是单个元素数组。它不足以将用户输入的输入命令保持为scanf输入。

command重新定义为100个元素的数组。

char command[100];