길이를 알 수 없는 입력 문자열을 읽으려면 어떻게 해야 합니까?
글씨를 쓸 요.char m[6];
,
그 단어의 길이는 아마 10에서 20개 정도 될 것이다.★★★를 어떻게 사용할 수 있습니까?scanf
보드드 ?력 ?? ????
#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;
}
길이=5의 문자열을 입력하십시오.
: hello
입니다.hello
영역을 동적으로 보호하면서 진입합니다.
예.
#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(*str)*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(*str)*(size+=16));
if(!str)return str;
}
}
str[len++]='\0';
return realloc(str, sizeof(*str)*len);
}
int main(void){
char *m;
printf("input string : ");
m = inputString(stdin, 10);
printf("%s\n", m);
free(m);
return 0;
}
C 표준에는 크기를 지정하지 않고 선을 얻을 수 있는 새로운 기능이 있습니다. getline
이 함수는 필요한 크기의 문자열을 자동으로 할당하므로 문자열 크기를 추측할 필요가 없습니다.하다
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *line = NULL;
size_t len = 0;
ssize_t read;
while ((read = getline(&line, &len, stdin)) != -1) {
printf("Retrieved line of length %zu :\n", read);
printf("%s", line);
}
if (ferror(stdin)) {
/* handle error */
}
free(line);
return 0;
}
현재의 컴퓨터에서는, 컴퓨터의 RAM 사용량에 거의 영향을 주지 않고, 매우 큰 문자열(수십만 문자)을 할당할 수 있습니다.그래서 너무 걱정하지 않아도 될 것 같아요.
그러나 옛날에는 메모리가 부족할 때는 문자열을 덩어리로 읽는 것이 일반적이었다. fgets
는 입력에서 최대 문자 수를 읽지만 나머지 입력 버퍼는 그대로 두기 때문에 나머지는 원하는 대로 읽을 수 있습니다.
이 예에서는 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;
}
에서는, 「」의 하고, 인 것을 확인할 가 있습니다.실제에서는, 다음의 반환치를 검증하고, 입력이 정상인 것을 확인할 필요가 있습니다.fgets
.
또한 읽기 입력 루틴의 마지막에는 바이트가 낭비되지 않습니다.문자열은 필요한 메모리사이즈를 갖추고 있습니다.
나는 임의의 긴 줄을 읽는 간단한 방법은 한 가지밖에 본 적이 없지만, 그것을 사용해 본 적은 없다.이런 것 같아요.
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);
}
m
%
★★★★★★★★★★★★★★★★★」s
scanf()
스트링을 측정하여 메모리를 할당하고 그 스트링을 그 스트링에 복사하여 할당한 메모리의 주소를 대응하는 인수에 저장합니다.다 쓰고 나면 해야 돼free()
바로 그거에요.
은 모든 것은 .scanf()
다른 사람들이 지적했듯이 가장 쉬운 해결책은 입력 길이에 제한을 두는 것입니다. 「」를 사용하고 는,scanf()
이치노
char m[100];
scanf("%99s",&m);
「 」의 사이즈는, 「 」라고 하는 점에 해 주세요.m[]
1 、 바 1 이 、 바 1 must 、 must must の between between must must must must の between between between between between between보다 .%
그리고.s
.
입력한 문자열이 99보다 길 경우 나머지 문자는 다른 콜 또는 에 전달된 형식 문자열에 의해 읽힐 때까지 대기합니다.scanf()
.
일반적으로.scanf()
사용자 입력 처리에는 권장되지 않습니다.다른 응용 프로그램에서 만든 기본 구조화된 텍스트 파일에 가장 적합합니다.이 경우에도 입력이 예상대로 포맷되지 않을 수 있습니다.누군가가 이 입력에 간섭하여 프로그램이 파손될 수 있습니다.
를 사용하여 할당된 공간에 직접 읽기fgets()
.
읽기 성공, 파일 종료, 입력 오류 및 메모리 부족 여부를 구별하려면 각별한 주의가 필요합니다.EOF에서 적절한 메모리 관리가 필요합니다.
이 메서드는 회선의'\n'
.
#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;
}
제가 4년 만에 도착해서 너무 늦은 건 알지만 누군가 이용할 수 있는 다른 방법이 있을 것 같아요.나는 사용했었다.getchar()
기능합니다 -하다. -
#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
더 안전한 방법을 제안할 수 있다면:
문자열을 저장할 수 있는 버퍼 크기를 선언합니다.
char user_input[255];
안전한 방법으로 사용자 입력을 가져옵니다.
fgets(user_input, 255, stdin);
입력을 안전하게 얻을 수 있는 방법.첫 번째 인수는 입력이 저장되는 버퍼로의 포인터, 두 번째 인수는 함수가 읽어야 할 최대 입력, 세 번째 인수는 표준 입력으로의 포인터, 즉 사용자 입력의 출처입니다.
특히 안전성은 버퍼 오버런을 방지하는 읽기 양을 제한하는 두 번째 인수에서 비롯됩니다.ㅇㅇㅇㅇ.fgets
는 처리된 문자열의 늘 종료를 처리합니다.
이 함수에 대한 자세한 내용은 여기를 참조하십시오.
편집: 포맷(예를 들어 문자열을 숫자로 변환)이 필요한 경우 입력 후 atoi를 사용할 수 있습니다.
또한 표준 입력 및 출력 솔루션을 가지고 있습니다.
#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);
}
보다 안전하고 빠른 (용량 2배)버전:
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);
}
문자 포인터를 사용하여 필요한 문자열을 저장합니다.가능한 문자열 크기에 대해 알고 있다면 함수를 사용하십시오.
char *fgets (char *str, int size, FILE* file);`
또는 요청된 메모리를 동적으로 제공하는 malloc() 함수를 사용하여 런타임에 메모리를 할당할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/16870485/how-can-i-read-an-input-string-of-unknown-length
'programing' 카테고리의 다른 글
사용자가 Vue JS에서 탐색 컨테이너 외부를 클릭할 때 탐색을 닫거나 전환하는 방법 (0) | 2022.07.06 |
---|---|
매핑된 Vuex 함수는 함수가 아니지만 로드됩니다. (0) | 2022.07.03 |
하위 구성 요소에 대한 v-model 및 하위 구성 요소 Vue 내부의 v-model (0) | 2022.07.03 |
Vue js가 잘못된 요소 높이를 반환함 (0) | 2022.07.03 |
Vue3에 Vuex를 설치하지 못했습니다. (0) | 2022.07.03 |