2016-11-13 16 views
1

なぜ機能しないのですか?プログラムの最後には、 "e primo"や "nao e primo"の代わりに2つの奇妙な文字が表示されます。あなたが私を助けることができれば、私は感謝しています。Printfの変な文字

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    // var 
    int n, c = 2; 
    char p[11]; 
    // code 
    printf("Informe um numero para checar se e primo: "); 
    scanf("%d", &n); 
    do { 
     if (n % c == 0) { 
      p[11] = 'e primo'; 
      break; 
     } else { 
      p[11] = 'nao e primo'; 
     } 
     c = c + 1; 
    } while (c != n/2); 
    printf("\nO numero %s", p); 
    return 0; 
} 
+1

: "定数の文字数が多すぎ" 行 'P [11] = '電子プリモ' において;'など –

答えて

1

あなたのプログラムはいくつかの問題があります:あなたは単純な代入p[11] = 'e primo';で文字列をコピーすることはできません

  • 。バッファを大きくするか、単に文字列ポインタ​​を使用すると、strcpy()を文字列に使用できます。

  • n4未満の場合、ループは永久に実行されます。より正確には、c = c + 1;が算術オーバーフローを起こすと、未定義の動作を引き起こします。

  • 結果は、他の値と正反対です。

  • 大きな素数のループは非常に遅いので、c * c > nのときは停止する必要があります。

ここ

が修正バージョンです:これはコンパイルされません

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    // var 
    int n, c; 
    const char *p = "e primo"; 
    // code 
    printf("Informe um numero para checar se e primo: "); 
    if (scanf("%d", &n) == 1) { 
     for (c = 2; c * c <= n; c = c + 1) { 
      if (n % c == 0) { 
       p = "nao e primo"; 
       break; 
      } 
     } 
     printf("O numero %s\n", p); 
     return 0; 
    } 
+0

なぜcharを配列に使うと、C [10] = 'hello'のようになります。ポインタを使うときは、C = "hello"なぜ最初に ""を使うのですか?最終?両方の文字列ではありませんか? – Gibas

+0

@Gibas: 'C [10] = 'hello''は構文エラーです(または決して使用されるべきではない古いマルチ文字文字定数です)。文字列は常に '' 'で囲まれています:' 'char C [10] =" e primo ";または配列の初期化に使うことができます。 – chqrlie

+0

私は間違った例を利用しました。私はあなたがc = "j"を使うことができないことを意味していましたが、あなたは次のことを行うことができます: "char * p =" e primo ";そしてポインタ代入:' p = "nao e primo";使用するchar C [10] = "e primo"単一の文字または文字列の場合、別の表記が必要なのでしょうか? – Gibas

1

配列には12番目の要素はありません。それらはp .Your割り当て(p[11] = 'e primo';)でのみ11の要素は、このようundefined behaviourにおける結果です。

'e primo'は実装定義の動作とリテラルマルチバイト文字です。コピーするにはstrcpy()を使用します。

strcpy(p, "e primo"); 

(コメント内の他の文字列コピーに長い文字列を格納するために、配列サイズを大きくします)。

あるいは、ヨーヨーは本当に配列を必要としないリテラルとしてあなたは、単に文字列を指すポインタを使用することができます。

char *p = "nao e primo"; 
printf("Informe um numero para checar se e primo: "); 
scanf("%d", &n); 
do { 
    if (n % c == 0) { 
     p = "e primo"; 
     break; 
    } else { 
     p = "nao e primo"; 
    ... 

printf("\nO numero %s", p); 

関連:Single quotes vs. double quotes in C or C++

+0

。 'nao e primo ''に対応する 'char p [11];のサイズを増やしてください。 –

0

まず、あなたは

p[11] = 'e primo'; 

pは文字の配列であり、p [11]を使用すると、11位に文字を設定または取得することができると言うことはできません。第2に、インデックス11の文字はありません。Cでは、インデックスは0から始まるので、p [0]、p [1]、...、p [10]の文字を取り出すことができます。 11要素。

あなたは警告を読みましたか?

1.c: In function ‘main’: 
1.c:16:21: warning: character constant too long for its type 
      p[11] = 'e primo'; 
        ^
1.c:16:21: warning: overflow in implicit constant conversion [-Woverflow] 
1.c:21:21: warning: character constant too long for its type 
      p[11] = 'nao e primo'; 
        ^
1.c:21:21: warning: overflow in implicit constant conversion [-Woverflow] 

それは実際にcharacter constant too long for its typeことを言います。

あなたが言うことができるもの:

p[10] = 'e' 

その後、%sのあなたは "文字列" を印刷:確定0で決定文字の配列。 ので、表示されている必要があり、最後の文字の後に、あなたが例えばを言わなければならない。: P [10] =「\ 0」。

私は、コードの作業になるだろうが、私は実際にポイントが何であるかわかりません。それはいつも最後の文字を何かに割り当てているようです。

+0

奇妙な文字は、最後の文字として** '\ 0' **がないことです。 ** char * p = "Some constant string" **を代入すると、Cはこれを行います。 –

関連する問題