Printf奇怪的人物

时间:2016-11-13 18:51:54

标签: c

为什么它不起作用?在程序的最后,它显示2个奇怪的字符而不是“e primo”或“nao e primo”。如果你能帮助我,我将不胜感激。

#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;
}

3 个答案:

答案 0 :(得分: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++

答案 1 :(得分:1)

您的计划存在一些问题:

  • 您无法使用简单作业p[11] = 'e primo';复制字符串。如果使缓冲区变大,则可以将strcpy()与字符串一起使用,或者只使用字符串指针const char *p;

  • 如果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;
    }

答案 2 :(得分:0)

首先,你不能说

p[11] = 'e primo';

p是字符数组,使用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打印“string”:字符数组确定为0 。 因此,在应该可见的最后一个字符之后,你必须说例如: p [10] ='\ 0'。

我会让代码工作,但我不确定究竟是什么意思。看起来,你总是将最后一个角色分配给某些东西。