第二个输入替换scanf和fgets中第一个输入的最后一个字符

时间:2016-11-27 09:21:54

标签: c

我正在尝试在C中使用字符串输入,我同时尝试了scanffgets。然而,正在发生的一件奇怪的事情是,当我在第一个字符串中输入大量输入,然后按Enter并输入第二个字符串时,第二个字符串将替换第一个字符串末尾的字符。 fgetsscanf都会发生这种情况。我做错了什么?

这是代码

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

#define MAX_SIZE 10000  // Added in the edit

int main() {
  char* str1;
  char* str2;
  char* deleted;
  int len1, len2;

  str1 = (char*)(malloc(sizeof(MAX_SIZE)));
  str2 = (char*)(malloc(sizeof(MAX_SIZE)));
  deleted = (char*)(malloc(sizeof(MAX_SIZE)));

  fgets (str1, MAX_SIZE, stdin);
  fgets (str2, MAX_SIZE, stdin);

  printf(" - %s - %d \n", str1, len1);
  printf(" - %s - %d \n", str2, len2);
}

这是输出:

$ ./a.out 
qwertyuiolkjhgfdsazxcvbnmSTACK
OVERFLOW
 - qwertyuiolkjhgfdOVERFLOW     <<<<<< The second string gets appended in the first
 - 25 
 - OVERFLOW
 - 9 

1 个答案:

答案 0 :(得分:1)

给定#define MAX_SIZE 10000

然后

str1 = (char*)(malloc(sizeof(MAX_SIZE))); //&lt; - 错误

您需要的是:

str1 = malloc(MAX_SIZE * sizeof(char));

此外,您拥有从未使用过的deleted变量。

请记住,fgets最后有\n,通常使用strcspnRemoving trailing newline character from fgets() input

删除

str1[strcspn(str1, "\n")] = 0;

最后,您正在使用len1len2完全未初始化,这会导致未定义的行为。你需要的是:

printf(" - %s - %zu \n", str1, strlen(str1));