char copy, array[20]
printf("enter ..."):
scanf("%s", array);
if (strlen(array) > 20 )
{
strcpy(copy, array....);
入力が20文字を超える場合、最初の20文字のみを取得するにはどうすればよいですか
char array[20+1];
scanf("%20s", array);
問題が解決しました。
コードがほとんどまたはまったく意味をなさないので、あなたの質問は明確ではありません。受信配列は20文字しかないため、入力は20文字を超えることはできません。ユーザーがさらに入力すると、プログラムは未定義の動作を生成します。したがって、ここでの主な問題は、コピーを制限することではなく、入力を制限することです。
ただし、あなたの質問は、限られた長さの文字列のコピーに関するもののようです。それが必要な場合は、残念ながら、その目的のための専用関数は標準ライブラリにありません。多くの実装は、まさにそれを行う非標準のstrlcpy
関数を提供します。したがって、実装が提供するかどうかを確認するか、自分で実装しstrlcpy
てstrlcpy
ください。
多くの場合strncpy
、そのような場合に使用するアドバイスが表示されることがあります。strncpy
この目的のために働くことに打ち勝つことは可能ですが、実際strncpy
にはそのように使用されることを意図していません。制限された長さの文字列コピー関数として使用strncpy
すると、常にエラーになります。それを避けてください。
strncpy
の代わりに使用しstrcpy
ます。それだけです。(注意:制限に達した場合、宛先文字列を NULL で終了strncpy
しません。)
編集: 私はあなたのプログラムを十分に注意深く読んでいませんでした。scanf
ユーザー入力が 20 文字を超えると、通話ですでに負けます。fgets
代わりに電話する必要があります。(個人的には、*scanf は決して使用すべきではないと思います。これは、それらが引き起こす問題に関する限り、氷山の一角にすぎません。) さらに、copy
20 文字ではなく 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' が含まれるように配列を宣言することを忘れないでください。
strncpy (copy, array, 20);
トリックを行います。ただし、文字列が20文字を超える場合、文字列はnullで終了しません。
http://www.cplusplus.com/reference/clibrary/cstring/strncpy/
strncpyを使用します。必ず宛先を null で終了してください。
strcpy() 呼び出しではなく、scanf() 呼び出しを変更する必要があります。
char copy[20], array[20];
printf("enter....");
scanf(%20s",array); // read a maximum of 20 characters
strcpy(copy, array);