How can I get a string from input without includin

2019-02-06 09:32发布

问题:

This question already has an answer here:

  • Removing trailing newline character from fgets() input 12 answers

I'm trying to write an inputted string elsewhere and do not know how to do away with the new line that appears as part of this string that I acquire with stdin and fgets.

 char buffer[100];
 memset(buffer, 0, 100);
 fgets(buffer, 100, stdin);
 printf("buffer is: %s\n stop",buffer);

I tried to limit the amount of data that fgets gets as well as limiting how much of the data is written but the new line remains. How can I simply get the inputted string up to the last character written with nothing else?

回答1:

try

fgets(buffer, 100, stdin);
size_t ln = strlen(buffer)-1;
if (buffer[ln] == '\n')
    buffer[ln] = '\0';


回答2:

Simply look for the potential '\n'.

After calling fgets(), If '\n' exists, it will be the last char in the string (just before the '\0').

size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
  buffer[--len] = '\0';
}

Sample usage

char buffer[100];
// memset(buffer, 0, 100); not needed
if (fgets(buffer, sizeof buffer, stdin) == NULL) { // good to test fgets() result
  Handle_EOForIOerror();
}
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
  buffer[--len] = '\0';
}
printf("buffer is: %s\n stop",buffer);

Notes:

buffer[strlen(buffer)-1] is dangerous in rare occasions when the first char in buffer is a '\0' (embedded null character).

scanf("%99[^\n]%*c", buffer); is a problem if the first char is '\n', nothing is read and '\n' remains in stdin.

strlen() is fast as compared to other methods: https://codereview.stackexchange.com/a/67756/29485

Or roll your own code like gets_sz