76

単語の長さがわからないと、書くことができません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;
}

length=5 の文字列を入力してください 入力
: こんにちは
これは文字列です: こんにちは

4

10 に答える 10

108

ダイナミックにエリアを確保しながら入場

例えば

#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;
}
于 2013-06-01T10:28:05.103 に答える
20

今日のコンピューターでは、非常に大きな文字列 (数十万文字) を割り当てても、コンピューターの 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

また、最後に readinput ルーチンの場合、無駄なバイトがないことに注意してください。文字列には、必要な正確なメモリ サイズがあります。

于 2013-06-01T10:42:38.587 に答える
1

で割り当てられたスペースに直接読み込みます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;
}
于 2015-12-06T22:43:34.893 に答える
1

必要な文字列を格納するために文字ポインタを取得します。文字列の可能なサイズについて何らかの考えがある場合は、関数を使用します

char *fgets (char *str, int size, FILE* file);`

それ以外の場合は、要求されたメモリを動的に提供するmalloc()関数を使用して、実行時にメモリを割り当てることもできます。

于 2013-06-01T09:08:47.437 に答える
0

私はまた、標準の入力と出力を備えたソリューションを持っています

#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);
}
于 2018-01-12T11:49:44.343 に答える