2016-11-13 105 views
1

爲什麼它不起作用?在節目結束時,它顯示2個奇怪的字符,而不是「e primo」或「nao e primo」。如果你能幫助我,我將不勝感激。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] = 'E的Primo';'等 –

回答

1

你的程序有一些問題:

  • 你不能用一個簡單的任務p[11] = 'e primo';複製串。如果將緩衝區設置得更大,或者可以使用字符串指針​​,則可以使用strcpy()和一個字符串。

  • 如果n小於4,循環將永久運行。更確切地說,當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」;'或者在上下文中它們衰減爲指針初始化的初始字符的指針: 'char * p =「e primo」;'和指針賦值:'p =「nao e primo」;' – chqrlie

+0

我利用了錯誤的例子,我的意思是你不能使用c =「j」,但你可以使用char C [10] =「e primo」如果是單個字符或字符串,是否需要不同的符號? – Gibas

1

數組中沒有第12個元素;他們只有p中的11個元素。因此您的任務(p[11] = 'e primo';)因此導致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

。 ..並增加'char p [11]的大小;'以適應'nao e primo''。 –

0

首先,你不能說

p[11] = 'e primo'; 

p是字符的陣列,並用對[11]可以設置或檢索第11位的字符。其次,索引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 =「某個常量字符串」**時,C會執行此操作。 –