programing

길이를 알 수 없는 입력 문자열을 읽으려면 어떻게 해야 합니까?

minecode 2022. 7. 3. 00:20
반응형

길이를 알 수 없는 입력 문자열을 읽으려면 어떻게 해야 합니까?

글씨를 쓸 요.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% ★★★★★★★★★★★★★★★★★」sscanf()스트링을 측정하여 메모리를 할당하고 그 스트링을 그 스트링에 복사하여 할당한 메모리의 주소를 대응하는 인수에 저장합니다.다 쓰고 나면 해야 돼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

반응형