Чтение номера телефона через строку не выполняется при запуске в полном коде [дубликат]

Обмен данными между примерами активности, передающими электронное письмо после входа в систему

«email» - это имя, которое может использоваться для ссылки на значение для запрашиваемой деятельности

1 Код на страница входа в систему

Intent openLoginActivity = new Intent(getBaseContext(), Home.class);
    openLoginActivity.putExtra("email", getEmail);

2 на домашней странице

Bundle extras = getIntent().getExtras();
    accountEmail = extras.getString("email");
9
задан Vayn 7 May 2011 в 00:37
поделиться

7 ответов

scanf() читает именно то, о чём вы его просили, оставив следующий \n с конца этой строки в буфере, где fgets() прочитает его. Либо сделайте что-нибудь, чтобы использовать новую строку, или (мое предпочтительное решение) fgets(), а затем sscanf() из этой строки.

18
ответ дан geekosaur 18 August 2018 в 19:59
поделиться
  • 1
    Если я хочу использовать scanf(), как я могу использовать новую строку? Благодарю. – Vayn 7 May 2011 в 00:59
  • 2
    Используйте что-то вроде %*[^\n]%*c в конце формата, чтобы пропустить любые символы в новой строке, а затем самой новой строкой. – geekosaur 7 May 2011 в 01:07
  • 3
    Я не знаю эту грамматику раньше, спасибо вам большое! – Vayn 7 May 2011 в 01:11
  • 4
    @geekosaur: просто нажатие %*[^\n]%*c на конец формата на самом деле не будет работать, если после предыдущей вещи и до новой строки нет символов, так как тогда %*[^\n] не будет соответствовать, так что %*c будут пропущены, а новая строка останется на входе. Вам нужно сделать %*c в отдельном вызове scanf, чтобы он работал. – Chris Dodd 16 May 2016 в 01:59

Следующее работает, если fgets() «пропущен» после использования scanf()

После того, как вы сказали:

scanf("%d", &loops);

Скажите:

char garbage[100];

fgets(garbage,100,stdin);

Это сохранит все, что осталось на входном буфере, в переменную мусора.

Это эффективно очистит входной буфер и позволит вам впоследствии использовать fgets().

EDIT: I недавно выяснили, что есть более легкое решение, чем выше. Если вы скажете getchar () после scanf (), это позволит вам использовать fgets () без проблем. getchar () получит следующий символ во входном буфере, который в этом случае будет «\n». После удаления '\n' из входного буфера fgets должен работать нормально.

0
ответ дан Coder Typist 18 August 2018 в 19:59
поделиться

Vayn,

Geekoaur ответил на ваш вопрос хорошо, я просто указываю еще одну «проблему» с вашим кодом.

Строка s1[strlen(s1)] = '\0'; - это no-op , если s1 уже полностью нулевое завершение до того, как оно выполняется.

Но если s1 NOT allready должным образом завершено нулем до того, как эта строка выполняется (и вам не повезло), это приведет к:

Это связано с тем, что strlen basicaly находит индекс существующего нуль-терминатора и возвращает его! Вот действительная, неоптимизированная реализация strlen:

int strlen(char *string) {
    int i = 0;
    while(string[i] != '\0') {
        ++i;
    }
    return i;
}

Итак ... Если вы ДЕЙСТВИТЕЛЬНО беспокоитесь о том, что строки НЕ были обнулены нулями, вы бы сделали что-то вроде:

  • string[sizeof(string)]='\0'; в локальных автоматических строках (где компилятор «знает» размер строки);
  • или string[SIZE_OF_STRING] для всех остальных строк, где SIZE_OF_STRING является (чаще всего) константой #define 'd или переменной, которую вы поддерживаете специально для хранения текущего SIZE (не длина) динамически выделяемой строки.

И если вы ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО беспокоились о том, что строки не заканчиваются на нуль (например, вы имеете дело с «грязными» методами libary (например, Tuxedo's ATMI, например), вы также «очищаете» свои «возвращаемые строки» перед передачей их методам подозрительной библиотеки с помощью:

  • до: memset(string, NULL, SIZE_OF_STRING);
  • invoke: DirtyFunction(/*out*/string);
  • после: string[SIZE_OF_STRING]='\0'

SIG11 - это полная привязка для поиска, потому что (если вы не «подключите» их к сигнальному процессору и сказать иначе, они заставляют unix жестко завершать вашу программу, поэтому вы не можете ничего регистрировать (после факта), чтобы помочь выяснить, где-в-а-а-а-а-о-о-о-о ... особенно учитывая, что во многих случаях строка кода, которая выбрасывает SIG11, не находится рядом с фактической причиной потери строки это нуль-терминатор.

Разве это имеет для вас смысл?

Cheers mate. Keith.

PS: ПРЕДУПРЕЖДЕНИЕ: strncpy НЕ все время имеет нулевое значение ... вы, вероятно, имели в виду strlcpy. Я усвоил этот трудный путь ... когда сработал биллинг на 60 миллионов долларов.


EDIT:

FYI: Вот «безопасная» (неоптимизированная) версия strlen который я назову strnlen (я считаю, что это должно быть в stdlib . Вздох.).

// retuns the length of the string (capped at size-1)
int strnlen(char *string, int size) {
    int i = 0;
    while( i<size && string[i]!='\0' ) {
        ++i;
    }
    return i;
}
2
ответ дан corlettk 18 August 2018 в 19:59
поделиться
  • 1
    Я новичок в C, и в учебнике много говорится о струне и безопасности. Может быть, мой учебник недостаточно хорош :( Спасибо за ваш профессиональный совет :) – Vayn 7 May 2011 в 02:09
  • 2
    Не делайте string[sizeof(string)]='\0'! Это будет писать запись \0 ПОСЛЕ выделенной памяти! sizeof(s1) - 101, а индекс s1 - от 0 до 100! Та же проблема возникает и с strnlen. Если нет \0, он вернет size, а не size - 1, как указано в комментарии! – TrueY 18 February 2016 в 00:19

scanf оставляет пробел во входном буфере, включая символы новой строки. Чтобы использовать fgets для чтения следующей строки, вам нужно вручную удалить оставшуюся часть текущей строки:

int c;
do{
    c = getchar();
}while(c != EOF && c != '\n');
4
ответ дан hugomg 18 August 2018 в 19:59
поделиться
  • 1
    Да, это тоже сработает, но я лично просто использую fgets, а затем sscanf (как было предложено geekosaur), потому что он работает «равномерно». для всех видов данных ... не только отдельных символов. И мне нравятся «универсальные, многоцелевые решения». Приветствия. Кит. – corlettk 7 May 2011 в 01:32
  • 2
    Это работает более чем на персонаже, хотя это и есть цикл для;) – hugomg 7 May 2011 в 02:22
  • 3
    while(c != EOF && c != '\n'); не годится. c выходит за рамки. – chux 23 February 2018 в 01:50
  • 4
    Я собирался извинить себя, сказав, что я, должно быть, смешивал правила C и Lua, но, видимо, этот ответ был до того, как я узнал Lua, ха-ха-ха. – hugomg 23 February 2018 в 03:45

Я знаю, что это очень старый. Я новичок в c и хотел проверить свой метод, который использует getchar:

#include <stdio.h>

int main()
{

    printf("Please enter your name\n");
    char string[10];

    scanf("%s", string);
    printf("Hello %s\n", string);

    //getchar();  # un commenting this line, fgets perfectly works!!
    printf("Please enter your name again\n");

    fgets ( string, 10, stdin );     

    printf("Hello again %s", string);

    getchar();
}
1
ответ дан Michele 18 August 2018 в 19:59
поделиться
  • 1
    Попробуйте ввести "Michele \n" (пробел после имени) и посмотрите, работает ли код с помощью «un commenting this line». – chux 23 February 2018 в 01:53

просто положите scanf("%d\n",&loops);

вместо scanf("%d",&loops);

1
ответ дан phantom_ab 18 August 2018 в 19:59
поделиться
  • 1
    Хотя этот ответ охватывает важный феномен первоначальной проблемы, он не может дать некоторое представление об этой проблеме. Таким образом, в лучшем случае полезно использовать оригинальную проблему exect и не очень полезно в долгосрочной перспективе. Пожалуйста, добавьте еще несколько объяснений, чтобы ваш ответ помог более поздним читателям найти похожие проблемы. – rpy 12 September 2016 в 13:48

Я решил вашу проблему. Теперь ваша программа работает нормально. Если у вас есть сомнения, вы можете спросить меня.

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

    int main()
    {
        int i, age;
        char phone[10];
        char name[100];
        printf("ENTER YOUR NAME:");
        fgets(name , 100 , stdin);

        printf("ENTER YOUR AGE:");
        scanf("%d",&age);

        printf("ENTER YOUR PHONE NUMBER:");
        scanf(" ");
        fgets(phone,10,stdin);


        printf("\nStudent detail\n");
        printf("Name: ");
        fputs(name , stdout );
        printf("Age: %d\n",age);
        printf("Phone Number: ");
        puts(phone);
        printf("----\n");
        return 0;

    }
-1
ответ дан Rohit Kadam 18 August 2018 в 19:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: