C Printf奇怪字符
为什么它不起作用?在节目的最后,它显示了2个奇怪的字符,而不是“e primo”或“nao e primo”。如果你能帮助我,我将不胜感激C Printf奇怪字符,c,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: ");
#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;
}
#包括
#包括
int main(){
//变量
int n,c=2;
charp[11];
//代码
printf(“最初的数字信息”);
scanf(“%d”和“&n”);
做{
如果(n%c==0){
p[11]=“e primo”;
打破
}否则{
p[11]=“nao e primo”;
}
c=c+1;
}而(c!=n/2);
printf(“\n数字%s”,p);
返回0;
}
数组中没有第12个元素;它们仅是p
中的11个元素。因此,您的赋值(p[11]=“e primo”;
)就是结果
'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);
相关:首先,你不能说
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]
它实际上说,字符常量对于它的类型来说太长了
你可以说:
p[10] = 'e'
然后,使用%s打印“字符串”:字符数组由determinate 0确定。
因此,在最后一个应该可见的字符之后,您必须说,例如:
p[10]='\0'
我会让代码正常工作,但我不确定真正的意义是什么。看起来,您总是将最后一个字符指定给某个对象。您的程序出现了一些问题:
- 不能用简单赋值复制字符串
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;
}
#包括
#包括
内部主(空){
//变量
int n,c;
const char*p=“e primo”;
//代码
printf(“最初的数字信息”);
如果(扫描频率(“%d”,&n)==1){
对于(c=2;c*c)这不会编译:p[11]=“e primo”;
等行中的“常量中的字符太多”,并增加char p[11];
的大小,以适应“nao e primo”
。奇怪的字符将缺少“\0”作为最后一个字符。分配char*p=“某些常量字符串”为什么当我们在数组中使用char时,我们会做出如下属性:C[10]=“hello”,而当我们使用指针时,我们会这样做:C=“hello”为什么我们在第一个上使用“”,在最后一个上使用“”?这不是两个字符串吗?@Gibas:C[10]=“hello”
是一个语法错误(或者是一个过时的多字符常量,永远不要使用)。字符串总是用双引号括起来。
“
。它们可以用来初始化数组:char C[10]=“e primo”
,或者在它们像指针初始化一样衰减为指向其初始字符的指针的上下文中:char*p=”e primo“
和指针赋值:p=“nao e primo”
我使用了错误的示例,我的意思是不能使用c=“j“但是您可以使用char C[10]=“e primo”如果是单个字符或字符串,是否需要使用不同的表示法?@Gibas:带单引号的语法用于单个字符常量,其计算结果为int
,其值为主机编码中的字符数:int c='e'带双引号(“
)的语法用于字符串,这些字符串是带有隐式尾随空终止符的字符数组(值为0
,通常表示为'\0'
)。例如“abcdef”[2]=='c'
是真的。谢谢你回答我所有的问题!