这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i,j,n;
scanf("%d",&n);
n*=n;
char str[n];
for(i=0;i<n;i++){
str[i]='*';
}
printf("%s",str);
printf("\n%d",strlen(str));
return 0;
}
我输入2,这是我得到的输出:
2
****ú@
7
在第2行中,它有一些奇怪的字符显示在控制台中(U + 0013或控制-S介于ú和@之间),但它没有显示在这里。 你能解释一下吗?
答案 0 :(得分:1)
printf("%s", str)
假设str
指向NUL终止的char数组(又名&#34; C string&#34;)。在您的情况下,str
未终止NUL,因此printf
正在缓冲区的末尾运行,导致未定义的行为。
要解决此问题,您需要做两件事:
char str[n+1]
for(i=0;i<n;i++){
str[i]='*';
}
str[n] = '\0';
答案 1 :(得分:1)
您正在使用%s
格式说明符进行打印,该格式说明符需要一个C字符串(char数组末尾有NUL字符)。您需要使最后一个字符\0
使printf
识别字符串的结尾并停止打印。因此,在数组中再分配一个字符,并将最后一个字符设置为\0
。
char str[n+1];
str[n] = '\0`;
答案 2 :(得分:0)
您需要NUL终止字符串,如下所示:
char str[n+1]; /// <<<
for(i=0;i<n;i++){
str[i]='*';
}
str[n]='\0'; /// <<<