2016-08-24 6 views
-5
char string = "default"; 
printf("The default String is: %s", &string); 
scanf("%s", &string); 
printf("You entered: %s", &string); 

最初のprintf文は&文字列をX(?_?として出力します。 2番目のprintfは、scanf文の後に、入力した文字列を出力します。scanfを使用した後に&演算子を使用するのはなぜですか?

var演算子は「メモリアドレスはvar」を意味するので、なぜ&文字列が入力された文字列を出力しますか?なぜ「文字列」だけを使用しようとすると、セグメンテーションフォルトが発生するのですか?

+7

あなたのコードは*未定義の動作の*と絶対だらけである:それは偶然で動作します。良い答えはかなり長いものになるでしょう。それを待ってみましょう。 – Bathsheba

+4

非常にフィットしているラインは有効ではありません。そのために後続のラインを理由づけるのは難しいです。 –

+4

コンパイラの警告に注意してこの質問の必要性を完全に取り除くことになったので、投票を終了してください。 –

答えて

3

あなたはstringを1文字として宣言しましたが、文字列で入力してください。これにより、未定義の動作が呼び出されます。あなたがあなたのコードを変更する必要があります。一般的には

char string [20] = "default"; //20 is random, you should use the maximum length of the input you may have 
printf("The default String is: %19s", string); 
scanf("%s", string); 
printf("You entered: %s", string); 

scanf引数としてメモリアドレスを取る必要があり、上記のコードでは、stringはメモリアドレスです。 scanfについてはthis linkで詳しく読むことができます。

+0

'char * string =" default ";'より正確になります。割り当てによってポインタが変更され、割り当てられた20個の文字にアクセスできなくなります。しかし、このプログラムはどちらの場合でも動作します。 – AhmadWabbi

+3

@AhmadWabbi試しましたか? –

+1

文字の配列を宣言する構文が正しくありません。 'scanf'に' '%19s" '書式を使って配列の境界から書き出さないようにしてください。 –

0

これが解決策になる:

char string[20]; 
strcpy(string, "default"); 
printf("The default String is: %s", string); 
scanf("%19s", string); 
printf("You entered: %s", string); 
+1

'strcpy(文字列、"デフォルト ");'は必要ではありません; 'char string [20] =" default ";'はうまくいきます。 – user694733

+0

@ user694733いいえ、私のコメントをMarieviとお読みください – AhmadWabbi

+1

あなたのコメントを見ました。間違っています。 'char string [20]'は配列で、 '=" default "'は有効な初期化子です。 N1570 6.7.9 p14:* "文字型の配列は、文字列リテラルまたはUTF-8文字列 リテラルで初期化することもでき、括弧で囲んでもかまいません(文字列リテラルの連続するバイト(文字がある場合は を含む)。アレイのサイズが不明な場合)、配列の 要素を初期化してください。 "* – user694733

1
#include <stdio.h> 
#include <string.h> 

char chomp(char* s, char c){ 
    size_t l = strlen(s); 
    if (!l) return 0; 
    return s[l-1] = s[l-1]==c ? '\0' : s[l-1]; 
} 

int main(){ 
    char string[] = "default"; /* sizeof(string) == strlen("default")+1 */ 
    printf("The default String is: %s\n", string); 
    //^ you want the array to decay to a char* here 
    /*scanf("%s", &string); -- DANGEROUS 
    -- scanf doesn't know how much space you have in string*/ 

    fgets(string /*decay again*/, sizeof(string), stdin); 
    /* fgets does know because you've told it with sizeof(string)*/ 

    chomp(string, '\n'); 
    printf("You entered: %s", string); 
    return 0; 
} 
+0

珍しいですが、 'fgets()'の後、 'string [0]'は0で 'l = strlen(s); s [l-1] 'が問題になります。守備的なコーディングは 'fgets()'の後の最初の文字がユーザーが入力したヌル文字でないことを保証します。 – chux

+0

@chuxありがとう! – PSkocik

関連する問題