Чтение строки из ввода с пробелом?



Я использую Ubuntu, и я также использую Geany и CodeBlock в качестве моей IDE.
То, что я пытаюсь сделать, это прочитать строку (например "Barack Obama") и поместить его в переменную:



#include <stdio.h>

int main(void)
{
char name[100];

printf("Enter your name: ");
scanf("%s", name);
printf("Your Name is: %s", name);

return 0;
}


выход:



Enter your name: Barack Obama
Your Name is: Barack


как я могу заставить программу прочитать название?

632   14  

14 ответов:

использование:

fgets (name, 100, stdin);

100 максимальная длина буфера. Вы должны настроить его в соответствии с вашими потребностями.

использование:

scanf ("%[^\n]%*c", name);

The [] - это набор символов. [^\n] говорит, что в то время как вход не перевод строки ('\n') принимать входные данные. Тогда с %*c он считывает символ новой строки из входного буфера (который не читается), и * указывает, что это чтение на входе отбрасывается (подавление назначения), поскольку вам это не нужно, и эта новая строка в буфере не создает никаких проблем для следующих входов, которые вы можете принять.

читайте здесь о набор и подавление задание операторы.

Примечание Вы также можете использовать gets но ....

никогда не используйте gets(). Потому что нельзя сказать не зная данных заранее сколько символов получит () прочитает, а потому что gets() будет продолжайте хранить символы после окончания буфера, это чрезвычайно опасно для использования. Он был использован для взлома компьютерной безопасности. Используйте .

попробуйте это:

scanf("%[^\n]s",name);

\n просто устанавливает разделитель для сканируемой строки.

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

scanf(" %[^\t\n]s",&str);

str - это переменная, из которой вы получаете строку.

#include<stdio.h>
int main()
{
   char name[100];
   printf("Enter your name: ");
   scanf("%[^\n]s",name);
   printf("Your Name is: %s",name);
   return 0;
}

Примечание: при использовании fgets(), последний символ в массиве будет '\n' время от времени , когда вы используете fgets() для небольших входов в CLI (интерпретатор командной строки), как вы заканчиваете строку с 'Enter'. Поэтому при печати строки компилятор всегда будет переходить к следующей строке при печати строки. Если вы хотите, чтобы входная строка имела нулевую завершенную строку, как поведение, используйте этот простой хак.

#include<stdio.h>
int main()
{
 int i,size;
 char a[100];
 fgets(a,100,stdin);;
 size = strlen(a);
 a[size-1]='';

return 0;
}

обновление: Обновление с помощью других пользователей.

С помощью этого кода Вы можете принимать ввод до нажатия клавиши enter на клавиатуре.

char ch[100];
int i;
for (i = 0; ch[i] != '\n'; i++)
{
    scanf("%c ", &ch[i]);
}
#include <stdio.h>
// read a line into str, return length
int read_line(char str[]) {
int c, i=0;
c = getchar();
while (c != '\n' && c != EOF) { 
   str[i] = c;
   c = getchar();
   i++;
}
str[i] = '';
return i;
}

"%s" будет считывать входные данные до тех пор, пока не будет достигнут пробел.

получает может быть хорошим местом для начала, если вы хотите прочитать строку (т. е. все символы, включая пробелы, пока не будет достигнут символ новой строки).

"Барак Обама" имеет пространство между "Барак" и "Обама". Чтобы учесть это, используйте этот код;

#include <stdio.h>
int main()
{
    printf("Enter your name\n");
   char a[80];
   gets(a);
   printf("Your name is %s\n", a);
   return 0;
}

правильный ответ:

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    // pay attention to the space in front of the %
    //that do all the trick
    scanf(" %[^\n]s", name);
    printf("Your Name is: %s", name);

    return 0;
}

это пространство перед % очень важно, потому что если у вас есть в вашей программе еще несколько scanf, скажем, у вас есть 1 scanf целочисленного значения и еще один scanf с двойным значением... когда вы достигнете scanf для вашего char (string name), эта команда будет пропущена, и вы не сможете ввести для нее значение... но если вы поместите это пространство перед%, все будет в порядке и ничего не пропустите.

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

можно использовать getline() или getdelim(), Если вы используете платформу с поддержкой posix. Если вы используете windows и minigw в качестве компилятора, то он должен быть доступен.

getline() определено как :

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

для того, чтобы принять входные данные, сначала вам нужно создать указатель на тип char.

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

// s is a pointer to char type.
char *s;
// size is of size_t type, this number varies based on your guess of 
// how long the input is, even if the number is small, it isn't going 
// to be a problem
size_t size = 10;

int main(){
// allocate s with the necessary memory needed, +1 is added 
// as its input also contains, /n character at the end.
    s = (char *)malloc(size+1);
    getline(&s,&size,stdin);
    printf("%s",s);
    return 0;
}

образец Вход:Hello world to the world!

выход:Hello world to the world!\n

одна вещь, чтобы заметить здесь, хотя выделенная память для s составляет 11 байт, где как входной размер 26 байт, getline перераспределяет s используя realloc().

так что это не имеет значения, как долго ваш вход.

size обновляется с no.байтов, как в приведенном выше примере ввода size будет 27.

getline() также считает \n как input.So ваш ' s 'будет держать' \n ' на конец.

существует также более общая версия getline(), которая составляет getdelim(), который принимает еще один дополнительный аргумент, то есть delimiter.

getdelim() определено как:

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

Linux man page

Если вам нужно прочитать более одной строки, необходимо очистить буфер. Пример:

int n;
scanf("%d", &n);
char str[1001];
char temp;
scanf("%c",&temp); // temp statement to clear buffer
scanf("%[^\n]",str);
scanf("%s",name);

использовать & С scanf вход

Comments

    Ничего не найдено.