Чтение строки из ввода с пробелом?
Я использую 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
как я могу заставить программу прочитать название?
14 ответов:
использование:
fgets (name, 100, stdin);
100максимальная длина буфера. Вы должны настроить его в соответствии с вашими потребностями.использование:
scanf ("%[^\n]%*c", name);The
[]- это набор символов.[^\n]говорит, что в то время как вход не перевод строки ('\n') принимать входные данные. Тогда с%*cон считывает символ новой строки из входного буфера (который не читается), и*указывает, что это чтение на входе отбрасывается (подавление назначения), поскольку вам это не нужно, и эта новая строка в буфере не создает никаких проблем для следующих входов, которые вы можете принять.читайте здесь о набор и подавление задание операторы.
Примечание Вы также можете использовать
getsно ....никогда не используйте
gets(). Потому что нельзя сказать не зная данных заранее сколько символов получит () прочитает, а потому чтоgets()будет продолжайте хранить символы после окончания буфера, это чрезвычайно опасно для использования. Он был использован для взлома компьютерной безопасности. Используйте .
#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);
Если вам нужно прочитать более одной строки, необходимо очистить буфер. Пример:
int n; scanf("%d", &n); char str[1001]; char temp; scanf("%c",&temp); // temp statement to clear buffer scanf("%[^\n]",str);
Comments