[英]C - Limit the string length
(对不起,我的英语不好 !)
我写了一个程序,要求您输入密码,密码不能超过一个特定的数字,在这种情况下为八个字符。 超过限制的字符将从数组中切出:
#include <stdio.h>
#define MAXCHAR 8
main()
{
char password[MAXCHAR];
int i;
char c;
printf("Insert password: MAX 8 CHARS!\n\n");
for(i = 0; i <= MAXCHAR; i++){
c = getchar();
if(i == MAXCHAR){
break;
}
else{
password[i] = c;
}
}
printf("%s\n", password);
}
因此该程序可以运行,但是存在“奇怪”问题。 如果限制为EIGHT,并且我输入的密码长于八个字符(例如:P455w0rds98),则输出将如下所示:
P455w0rd☺
所以结尾处带有笑脸,我不知道为什么。 仅当将限制设置为8时才会发生。
您必须指定打印或终止字符串的长度。 否则,您将调用未定义的行为 。 尝试执行后一种方法。
#include <stdio.h>
#define MAXCHAR 8
int main(void)
{
char password[MAXCHAR + 1]; /* allocate one more element for terminating null-character */
int i;
char c;
printf("Insert password: MAX 8 CHARS!\n\n");
for(i = 0; i <= MAXCHAR; i++){
c = getchar();
if(i == MAXCHAR){
break;
}
else{
password[i] = c;
}
}
password[MAXCHAR] = '\0'; /* terminate the string */
printf("%s\n", password);
}
有人说if(i == MAXCHAR){ break; }
if(i == MAXCHAR){ break; }
部分看起来不太好,所以这是另一个代码示例:
#include <stdio.h>
#define MAXCHAR 8
int main(void)
{
char password[MAXCHAR + 1]; /* allocate one more element for terminating null-character */
int i;
printf("Insert password: MAX 8 CHARS!\n\n");
/* read exactly 8 characters. To improve, breaking on seeing newline or EOF may be good */
for(i = 0; i < MAXCHAR; i++){
password[i] = getchar();
}
password[MAXCHAR] = '\0'; /* terminate the string */
getchar(); /* to match number of call of getchar() to the original: maybe for consuming newline character after 8-digit password */
printf("%s\n", password);
}
所有C风格的字符串都有一个结尾\\0
字符(值0)。 这对于任何其他字符值都是唯一的,因此可以用来表示字符串的结尾。 您观察到的笑脸只是某些相邻存储块的一部分,该存储块恰好在第一个字节后具有空字符(因此,只有一个额外的字符)。 printf
函数从给定的字符串中读取字节,直到看到\\0
为止。 要解决您的问题,您可以写
password[MAXCHAR] = '\0';
(您需要在数组中为\\0
保留一个额外的字节)。
或者,您可以从一开始就将阵列归零:
char password[MAXCHAR + 1] = { };
或使用memset
:
memset(password, '\0', sizeof password);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.