2017-03-16 13 views
0

CS50 IDEのprintf関数に問題があります。文字列(このコードではsalt)を出力するためにprintfを使用している場合、元の引数(argv)には存在しない余分な文字が出力されています。CS50 IDE:printfは余分な文字を返します

以下は私のコードです。どんな助けもありがとう。ありがとうございました。あなたのケースでは

#include <cs50.h> 
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h> 

int main(int argc, string argv[]) 
{ 
    // ensuring that only 1 command-line argument is inputted 
    if (argc != 2) 
    { 
     return 1; 
    } 
    char salt[2]; 
    for (int i = 0; i < 2; i++) 
    { 
     char c = argv[1][i]; 
     salt[i] = c; 
    } 

    printf("the first 2 characters of the argument is %s\n", salt); 

} 
+0

C文字列は_null-terminated_でなければなりません。 – ForceBru

+0

私たちに見せてください_元の引数(argv)._ – BLUEPIXY

+0

'printf(引数の最初の2文字は%s \ n"、塩); ' - >' printf( "引数の最初の2文字は% .2s \ n "、salt); ' – BLUEPIXY

答えて

2

saltに文字列ターミネータがありません。

どういうわけか、コンピュータは文字列がどこでメモリで終わるかを知る必要があります。値が0のバイトであるNULバイトが出現するまで読み込みます。

あなたのアレイsaltは、正確に2バイトのスペースを持っていて、その後、あなたのアレイの次のメモリに次のようなランダムなガーベッジが存在します。文字列ターミネータがないので、コンピュータはNULバイトを検出するまでこのゴミを読み込みます。

すべてを行う必要がそうのように、あなたの配列で、このようなバイトが含まれます:

char salt[3] = {0}; 

これはsalt 1バイト長くなります、と{0}はの内容を初期化します{0, 0, 0}の省略形ですすべてのゼロを持つ配列(char salt[3];を使用し、後でsalt[2] = 0;を使用して最後のバイトをゼロに手動で設定することもできます)。

+0

すばらしい返答をいただきありがとうございます。理解を明確にするための簡単な質問:char salt [3] = {0};を初期化した後に 'printf(%s \ n、salt)'を実行すると、なぜコンパイラは'' salt [2] 'の' 0'は '0 'の文字ではありませんが、文字列のヌル終了文字は? – laserguidedtofu

+0

_character_'0'は、この文脈では '_value_'48'に等しい ''0''と書かれているからです。 'char test [6] = {'1'、 '0'、49、48、1,0}を試してください。 sprintf( "%s \ n"、test); '私の意味を理解する。 (ヒント:スマイリーの値は「1」です)。 https://en.wikipedia.org/wiki/ASCII#Code_chart – CherryDT

+0

をご覧ください。ありがとうございます。しかし、この例では、 'printf("%s \ n "、test)'を意味し、 'sprintf'を意味しませんでした。もし私が間違っていると私を訂正してください: 'sprintf'はその例に割り当てられていないバッファが割り当てられている必要があります。乾杯! – laserguidedtofu

0

saltargv[1]が唯一の要素でない限り、それはNULL終止符を含んでいない、文字列であることの恥ずかしがり屋の少なくとも一つの要素です。

あなたはNULL終止符を保持するためのスペースを割り当てる必要があり、実際にprintf()の場合の%s変換指定の引数のために予想されるように、saltとして文字列を使用できるようにそこに1を入れました。

それ以外の場合、文字列に関連する関数と演算は、char配列の終わりを示すヌルターミネータ(つまり、アクセス可能な有効なメモリの最後をマークする)が必須であるという事実に本質的に依存します。有効なメモリを越えてアクセスしようとすると、undefined behaviorが発生します。 UBにヒットしたら、何も保証されません。あなたが確認する必要があり

だから、あなたは

を使用したいという事実を考慮 "引数の最初の2つの文字が.... ....."

salt 3エレメントcharアレイであり、salt[2]にヌルターミネーターが含まれていることを確認してください('\0'など)。

関連する問題