从scanf获取任意数量的参数

时间:2014-04-10 05:52:52

标签: c segmentation-fault malloc scanf

嘿,我想知道是否有人知道如何解决这个问题。我希望获取用户输入,并从该预制件中获取一些操作。现在我在scanf线上遇到了一个段错误,无法弄清楚原因。之后,我试图将两个数组连接在一起并提供帮助,这也很棒。

char command[1000];
char firstName[1000];
char lastName[1000];
char month[1000];
char day[1000];

while( strcmp("quit", &command[0]) != 0 ){
    fflush(stdin);

    printf("Please enter next command: ");
    scanf("%s", command);                    // <--- This is tested and working

    if(strcmp(&command[0], "quit") == 0){
        break;
    }

    else if(strcmp(&command[0], "empty") == 0){
        empty();
    }
    else if(strcmp(&command[0], "append") == 0){
        printf("--------->1");

        scanf("%s %s %s %s", firstName, lastName, month, day); //<--- This line :(

        printf("--------->2");  // <---- This never prints
        char fullName[2001];
        char birthday[2001];

        malloc(strlen(firstName) + 1);
        strcpy(firstName, fullName);

        malloc(strlen(lastName) + 1);
        strcpy(lastName, fullName);
        printf("%s", fullName);

从终端:

gregs-mbp:desktop GregR$ ./blist
Please enter next command: append greg r jan 02
Segmentation fault: 11
gregs-mbp:desktop GregR$ ./blist
Please enter next command: append     
--------->1greg r jan 02
Segmentation fault: 11
gregs-mbp:desktop GregR$ 
gregs-mbp:desktop GregR$ ./bList
Please enter next command: quit
All done

2 个答案:

答案 0 :(得分:3)

代码中的scanf没有问题。问题在于代码

    char fullName[2001];
    char birthday[2001];

    malloc(strlen(firstName) + 1);
    strcpy(firstName, fullName);

    malloc(strlen(lastName) + 1);
    strcpy(lastName, fullName);
    printf("%s", fullName);

这应该是

    char fullName[2001];
    char birthday[2001];

    strcpy(fullName,firstName);
    strcat(fullName,lastName);

    printf("%s", fullName);

工作程序示例:http://ideone.com/dvpHYL

我认为段错是由strcopy的反向论据引起的。 fullName中可能存在一些任意数据(因为它之前没有初始化),并且在尝试将其复制到firstName(具有较小的大小)时,数据被写入超出边界的范围内。 malloc也不是必需的,但它们不应该导致段错误,只会导致内存泄漏。

答案 1 :(得分:0)

sscanf(command,"%s %s %s %s %s\n", cmdstring, firstName, lastName, month, day);