4
char copy, array[20]

    printf("enter ..."):
    scanf("%s", array);

    if (strlen(array) > 20 ) 
      { 
       strcpy(copy, array....); 

入力が20文字を超える場合、最初の20文字のみを取得するにはどうすればよいですか

4

7 に答える 7

5
char array[20+1];
scanf("%20s", array);

問題が解決しました。

于 2011-02-25T21:35:39.200 に答える
3

コードがほとんどまたはまったく意味をなさないので、あなたの質問は明確ではありません。受信配列は20文字しかないため、入力は20文字を超えることはできません。ユーザーがさらに入力すると、プログラムは未定義の動作を生成します。したがって、ここでの主な問題は、コピーを制限することではなく、入力を制限することです。

ただし、あなたの質問は、限られた長さの文字列のコピーに関するもののようです。それが必要な場合は、残念ながら、その目的のための専用関数は標準ライブラリにありません。多くの実装は、まさにそれを行う非標準のstrlcpy関数を提供します。したがって、実装が提供するかどうかを確認するか、自分で実装しstrlcpystrlcpyください。

多くの場合strncpy、そのような場合に使用するアドバイスが表示されることがあります。strncpyこの目的のために働くことに打ち勝つことは可能ですが、実際strncpyにはそのように使用されることを意図していません。制限された長さの文字列コピー関数として使用strncpyすると、常にエラーになります。それを避けてください。

于 2011-02-25T21:35:21.557 に答える
1

strncpyの代わりに使用しstrcpyます。それだけです。(注意:制限に達した場合、宛先文字列を NULL で終了strncpyしません。)

編集: 私はあなたのプログラムを十分に注意深く読んでいませんでした。scanfユーザー入力が 20 文字を超えると、通話ですでに負けます。fgets代わりに電話する必要があります。(個人的には、*scanf は決して使用すべきではないと思います。これは、それらが引き起こす問題に関する限り、氷山の一角にすぎません。) さらに、copy20 文字ではなく 1 文字しか入力できません。しかし、それはあなたのタイプミスだと思います。

于 2011-02-25T21:32:32.213 に答える
1

あるいは、strcpy を使用して 20 文字だけを読み取る必要はありません (また、strings.h を含める必要もありません)。

char c;
for( i = 0; i < 20; i++ ) {
    c = getchar();
    if (c != '\n') array[i] = c;
    else break;
}
array[i+1] = '\0';

char array[21]必ず '\0' が含まれるように配列を宣言することを忘れないでください。

于 2011-02-25T21:38:29.783 に答える
0
 strncpy (copy, array, 20);

トリックを行います。ただし、文字列が20文字を超える場合、文字列はnullで終了しません。

http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

于 2011-02-25T21:33:12.107 に答える
0

strncpyを使用します。必ず宛先を null で終了してください。

于 2011-02-25T21:32:43.913 に答える
0

strcpy() 呼び出しではなく、scanf() 呼び出しを変更する必要があります。

char copy[20], array[20];
printf("enter....");
scanf(%20s",array); // read a maximum of 20 characters
strcpy(copy, array);
于 2011-02-25T21:38:34.117 に答える