만약 내가 모르는 단어를 쓸 수 없는 것은 내가 얼마나 don& # 39 m, [6] ',' 챨. 아마 10 년이나 20 한마디의 길이가 길다. 스칸프 '' 키보드 입력을 afaq 사용하려면 어떻게 해야 합니까?
#include <stdio.h>
int main(void)
{
char m[6];
printf("please input a string with length=5\n");
scanf("%s",&m);
printf("this is the string: %s\n", m);
return 0;
}
아이폰에 있는 desktopplatforms 입력입니다 문자열으로 = 5 안녕하세요 이것은 구체화하십시오: 안녕하세요
E. G.
#include <stdio.h>
#include <stdlib.h>
char *inputString(FILE* fp, size_t size){
//The size is extended by the input with the value of the provisional
char *str;
int ch;
size_t len = 0;
str = realloc(NULL, sizeof(char)*size);//size is start size
if(!str)return str;
while(EOF!=(ch=fgetc(fp)) && ch != '\n'){
str[len++]=ch;
if(len==size){
str = realloc(str, sizeof(char)*(size+=16));
if(!str)return str;
}
}
str[len++]='\0';
return realloc(str, sizeof(char)*len);
}
int main(void){
char *m;
printf("input string : ");
m = inputString(stdin, 10);
printf("%s\n", m);
free(m);
return 0;
}
이제, 도망칠 수 있는 컴퓨터 문장열 만드는 동시에 구사할 수 있는 매우 큰 차질이 빚어질 수밖에 없다 (수십만 명의 자) 이 computer& # 39, s 램 사용. 그래서 wouldn& # 39, t 너무 걱정하는 것.
그러나 옛날 때 읽을 수 있는 것은, 메모리 부족, 일반적인 관행으로 문장열 청크를 있었다. '자' 를 최대 수를 프리츠 판독합니다 닫히지만 입력입니다 에서, 나머지는 그대로 읽을 수 있도록 입력 버퍼 미삭 it 에서 하지만 좋아해요.
이 예에서, 200 자, 내가 읽을 청크를 확장하지만 있는모든 청크가 크기 운영까지도 물론이겠지 사용할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* readinput()
{
#define CHUNK 200
char* input = NULL;
char tempbuf[CHUNK];
size_t inputlen = 0, templen = 0;
do {
fgets(tempbuf, CHUNK, stdin);
templen = strlen(tempbuf);
input = realloc(input, inputlen+templen+1);
strcpy(input+inputlen, tempbuf);
inputlen += templen;
} while (templen==CHUNK-1 && tempbuf[CHUNK-2]!='\n');
return input;
}
int main()
{
char* result = readinput();
printf("And the result is [%s]\n", result);
free(result);
return 0;
}
이것이 간단한 예를 들어 오류 없이 확인; 실제로 합니다 (입력) 은 반환 값 '프리츠 smartupdate 확인하여'.
또한, 아니 바이트입니다 낭비됩니다 레이디 푸트 경우 일상적인 끝에 있다. 문자열 는 정확한 메모리 크기 필요가 있다고 한다.
char *m = NULL;
printf("please input a string\n");
scanf("%ms",&m);
if (m == NULL)
fprintf(stderr, "That string was too long!\n");
else
{
printf("this is the string %s\n",m);
/* ... any other use of m */
free(m);
}
스칸프 () '의' 알 '간' % '및' 이 어딜가던지 구체화하십시오 측정할 수 있으며, 메모리 할당 및 it · 복사합니다를 구체화하십시오 과감히 메모리 주소를 저장하는 데 할당된 후 해당 인수. # 39 한 번 you&, re free () '이' 이 객체에는 수행됨 합니다.
가장 손쉬운 해결책은 다른 %s/dbase/ext_table. 지적한 대로 길이에 제한이 설정되었습니다 입력입니다. 스칸프 () '다음' 사용할 경우 계속 이렇게 할 수 있습니다.
char m[100];
scanf("%99s",&m);
참고로 1 바이트 크기의 어딜가던지 [] '의' 및 '%' 간 큰 수보다 이상이어야 합니다.
이 경우, 그 이상 기다리는 구체화하십시오 입력되었는지 99 남아 있는 문자를 읽을 수 있는 다른 통화 의해 전달된 문자열을 스칸프 () '또는' 미삭 형식.
스칸프 () '는' 일반적으로 권장되지 취급료 사용자 입력입니다. # 39 의 가장 기본적인 발려짐 it& 구조화된 텍스트 파일을 다른 응용 프로그램에 의해 작성된. 그런데도 입력 못할 수 있다는 사실을 알고 있어야 합니다 포맷되었을 예상대로 누군가 이 프로그램에 따라 분할하려면 시도하시려면 방해한 있을 수 있습니다.
난 과민반을을 제안하세요 경우 안전한 외곽진입:
너희가운데 버퍼입니다 수용할 정도로 충분히 큰 문자열이:
'' 챨 user_input [255w];
'프리츠 (user_input, 255, stdin). '
안전한 방법은 입력, 첫 번째 인수 기술입니까 포인터입니다 있는 버퍼입니다 입력입니다 저장됩니까 최대 입력 이 함수는 두 번째, 세 번째는 포인터입니다 읽고 있는 표준 입력, 즉 사용자 입력 비롯됩니다.
특히 두 번째 인수를 통해 안전 않했노라 양을 제한할 수 있는 버퍼 넘침 읽게 됩니다. 또한 '는' 프리츠 null 종료 잘 처리된 구체화하십시오.
해당 함수에 대한 자세한 정보 here.
편집: 해야 할 경우 모든 포맷 (예를 들면 변환하시겠습니까 문자열으로 맞추기바인딩 번호임) [트로이] [2] 나면 입력입니다 사용할 수 있습니다.
[2]: kw (http://www.cplusplus.com/reference/cstdlib/atoi/) = 트로이?
안전하고 빠른 (두 용량) 버전:
char *readline(char *prompt) {
size_t size = 80;
char *str = malloc(sizeof(char) * size);
int c;
size_t len = 0;
printf("%s", prompt);
while (EOF != (c = getchar()) && c != '\r' && c != '\n') {
str[len++] = c;
if(len == size) str = realloc(str, sizeof(char) * (size *= 2));
}
str[len++]='\0';
return realloc(str, sizeof(char) * len);
}
내가 알고 있는 나는 4 년 후 도착한 키워봤지 늦었음요 근데 다른 길을 가는 것을 사용할 수 있다. I ' ()' 기능을 이 제처 와 같은 있었다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//I had putten the main Function Bellow this function.
//d for asking string,f is pointer to the string pointer
void GetStr(char *d,char **f)
{
printf("%s",d);
for(int i =0;1;i++)
{
if(i)//I.e if i!=0
*f = (char*)realloc((*f),i+1);
else
*f = (char*)malloc(i+1);
(*f)[i]=getchar();
if((*f)[i] == '\n')
{
(*f)[i]= '\0';
break;
}
}
}
int main()
{
char *s =NULL;
GetStr("Enter the String:- ",&s);
printf("Your String:- %s \nAnd It's length:- %lu\n",s,(strlen(s)));
free(s);
}
다음은 샘플링합니다 엔드입니다 실행하십시오 프로그램 -
Enter the String:- I am Using Linux Mint XFCE 18.2 , eclispe CDT and GCC7.2 compiler!!
Your String:- I am Using Linux Mint XFCE 18.2 , eclispe CDT and GCC7.2 compiler!!
And It's length:- 67
난 또 솔루션 (표준 입력 및 출력
#include<stdio.h>
#include<malloc.h>
int main()
{
char *str,ch;
int size=10,len=0;
str=realloc(NULL,sizeof(char)*size);
if(!str)return str;
while(EOF!=scanf("%c",&ch) && ch!="\n")
{
str[len++]=ch;
if(len==size)
{
str = realloc(str,sizeof(char)*(size+=10));
if(!str)return str;
}
}
str[len++]='\0';
printf("%s\n",str);
free(str);
}
직접 할당할지 공간이 '읽기' fgets () 기능으로 문자열들을 읽는다.
성공적인 읽기, 파일 끝, 입력 오류 및 밖으로의 각별한 주의가 필요하다고 구별하기 위해 메모리. 메모리 관리 필요할 이벤트수정적절한 EOF.
이 방법은 line& # 39, & # 39, 각국의 \n& # 39 의 ','.
#include <stdio.h>
#include <stdlib.h>
#define FGETS_ALLOC_N 128
char* fgets_alloc(FILE *istream) {
char* buf = NULL;
size_t size = 0;
size_t used = 0;
do {
size += FGETS_ALLOC_N;
char *buf_new = realloc(buf, size);
if (buf_new == NULL) {
// Out-of-memory
free(buf);
return NULL;
}
buf = buf_new;
if (fgets(&buf[used], (int) (size - used), istream) == NULL) {
// feof or ferror
if (used == 0 || ferror(istream)) {
free(buf);
buf = NULL;
}
return buf;
}
size_t length = strlen(&buf[used]);
if (length + 1 != size - used) break;
used += length;
} while (buf[used - 1] != '\n');
return buf;
}
샘플 사용
int main(void) {
FILE *istream = stdin;
char *s;
while ((s = fgets_alloc(istream)) != NULL) {
printf("'%s'", s);
free(s);
fflush(stdout);
}
if (ferror(istream)) {
puts("Input error");
} else if (feof(istream)) {
puts("End of file");
} else {
puts("Out of memory");
}
return 0;
}