Как обнаружить \ n, а затем удалить его? - PullRequest
0 голосов
/ 30 октября 2018

Я работал над проблемой. Мне нужно отсканировать \n, чтобы завершить цикл и удалить его, чтобы не остаться в переменной с другим текстом. Пока у меня есть это:

do {                                    
    scanf("%[^\n]", userinput);            //loads stdin to char[] variable  
    end = userinput[0];                    //loads one char to char variable
    scanf("%*c");                          //should remove \n
    strcpy(inputstorage[i], userinput);    //copies userinput into 2d array of 
    i++;                                   //string with \n removed
} while (end != '\n');                     //should end cycle when I hit enter

Что это делает, когда я нажимаю ввод, он сохраняет последний символ в конце переменной.

Например, я ввожу: 'Hello'

В userinput есть: 'Hello'

В end есть 'H'

Когда я нажимаю клавишу Enter, переменная конца должна содержать \ n, но по какой-то причине она содержит 'H'. Я ценю всю помощь, которую вы можете оказать

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

end = userinput[0]; сохраняет первый символ ввода. scanf("%[^\n]", userinput); не помещает '\n' в userinput[], поэтому проверка, является ли end концом строки, бесполезна.


Используйте fgets(), чтобы прочитать строку

char userinput[100];
if (fgets(userinput, sizeof userinput, stdin)) {

Затем отбросьте потенциал '\n' с помощью различных средств .

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

Если код обязан использовать scanf(),

int count;
do {        
  char userinput[100];

  // Use a width limiter and record its conversion count : 1, 0, EOF
  // scanf("%[^\n]", userinput);
  count = scanf("%99[^\n]", userinput);

  // Consume the next character only if it is `'\n'`. 
  // scanf("%*c");
  scanf("%*1[\n]");

  // Only save data if a non-empty line was read
  if (count == 1) {
    strcpy(inputstorage[i], userinput);
    i++;
  } 
} while (count == 1);
// Input that begins with '\n' will have count == 0

Повторно сформированный цикл может использовать

char userinput[100];
int count;
while ((count = scanf("%99[^\n]", userinput)) == 1) {
  scanf("%*1[\n]");
  strcpy(inputstorage[i++], userinput);
}
scanf("%*1[\n]");

Обратите внимание, что код OP использует '/n' в while (end != '/n');. Это не символ конца строки '\n', а редко используемая многосимвольная константа. Конечно, не то, что хотел ОП. Это также подразумевало, что предупреждения не были полностью включены. Экономьте время, включите все предупреждения. @aschepler.

0 голосов
/ 30 октября 2018

Вы можете использовать scanf, getline или fgets , чтобы получить строку, а затем strcspn , чтобы удалить "\ n".

например. userInfo[strcspn(userInfo, "\n")] = 0;

...