【问题标题】:Get arbitrary number of arguments from scanf从 scanf 获取任意数量的参数
【发布时间】:2014-04-10 05:52:52
【问题描述】:

嘿,我想知道是否有人知道如何解决这个问题。我想获取用户输入并从中执行一些操作。现在我在 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

【问题讨论】:

  • 您的代码没有给出分段错误。你能给出你得到输出分段错误的输入吗?
  • 您的代码中有其他错误和对malloc 的异常调用,但scanf 行没有任何问题。
  • @R Sahu - 就像gets 没有任何问题一样。我总是想知道为什么人们跳上gets,却对scanf("%s"一言不发
  • 他应该在 ---> 箭头打印中添加换行符,以阐明段错误实际发生的位置。
  • strcmp 将因“append Greg r Jan 02”和“append”而失败。那么它就会将条件传递给我们看不到的东西。这就是第一种情况下的段错误。

标签: c segmentation-fault malloc scanf


【解决方案1】:

您的代码中的 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(具有较小的大小)时,数据被写入超出范围。 mallocs 也不是必需的,但它们不应导致段错误,只会导致内存泄漏。

【讨论】:

  • 不知道为什么这在第一次不起作用。但似乎解决了正在发生的任何事情。太奇怪了 printf("---->2") 没有出现在终端中
  • @Greg 你为什么从你的帖子中删除这个代码然后接受这个作为正确答案?请考虑将问题回滚到之前的代码,否则问题不再有意义。
  • @Greg,@Jim 我添加了一些关于段错误的解释。
  • 我不认为导致段错误有两个原因。无论如何,第一个 char 数组通常(但不总是)归零。其次,他的 strcmp 错误导致这段代码甚至没有被执行。
  • @Greg, --->2 从未出现过,可能是因为没有换行符并且它从未被刷新。
【解决方案2】:
sscanf(command,"%s %s %s %s %s\n", cmdstring, firstName, lastName, month, day);

【讨论】:

  • 我仍然收到段错误 11
  • 那肯定不能解决问题。
  • 好吧,看看实际输入后,你的猜测并没有完全错误;)
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2013-02-23
  • 2021-08-26
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
相关资源
最近更新 更多