C-限制字符串长度

C-限制字符串长度,c,arrays,loops,C,Arrays,Loops,对不起,我的英语不好 我编写了一个程序,要求您键入一个不超过某个数字的密码,在本例中为8个字符。超过限制的字符将从数组中删除: #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;

对不起,我的英语不好

我编写了一个程序,要求您键入一个不超过某个数字的密码,在本例中为8个字符。超过限制的字符将从数组中删除:

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

所以它在结尾放了一个微笑,我不知道为什么。只有当限制设定为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);
}

除了您已经收到的答案外,另一种方法是使用读取用户输入

在这种情况下,您不需要对每个字符输入进行计数,您可以指定最大大小并完成它。差不多

 fgets(password, MAXCHAR, stdin);
可以为您完成工作,减去每个元素的循环和分配

但是,有一件事需要记住,对于比给定长度更短的输入,fgets也会读取并存储尾随的换行符,您可能需要手动消除这种情况。阅读链接的手册页了解更多想法


也就是说,main对于托管环境来说是一个非常糟糕且几乎非标准的组件。至少为了符合标准,您应该使用int mainvoid。

所有C样式字符串都有一个终端\0字符值0。这与任何其他字符值都是唯一的,因此可以使用它来表示字符串的结束。您观察到的笑脸只是某个相邻内存块的一部分,该内存块恰好在第一个字节后有一个空字符,因此只有一个额外字符。printf函数从指定给它的字符串中读取字节,直到看到\0为止。要解决你的问题,你可以写

password[MAXCHAR] = '\0';
您需要在数组中为\0额外保留一个字节

或者,您可以从一开始就将阵列归零:

char password[MAXCHAR + 1] = { };
或使用memset:


fori=0;我@SouravGhosh在循环中有一个黑客来解决它:更新:是的,你已经看到了。这是一个在不了解根本原因的情况下放置修补程序的典型示例。@SouravGhosh将读取9个字符,但仅存储8个字符+空字符。这可能是一个奇怪的规范,但我不认为它是无效的。@MikeCAT,它会误导用户,认为他的密码是9个字符。@MikeCAT根据您的代码,它是8+换行符。不管怎么说,整个if-break的事情都是胡说八道。轻微的更正没有冒犯:你的意思是要求你键入一个密码数字有不同的含义,在这里很烦人。你应该阅读更多关于getchar.Olaf的内容,如果你希望在这个论坛上显示精确的术语,你是在让自己失望。我很少看到专家们以一致、深思熟虑的方式使用恰当的术语。@BruceDavidWilner你为什么要说这样的话。。。计算机编程可能不适合你。该死的,你毁了我,我只是一个新手,当一个记者发布这个。您所说的一点也不令人鼓舞。fgetsof MAXCHAR字符实际上读取MAXCHAR-1字符,并使用最后一个字符作为字符串结尾。它还会在看到MAXCHAR-1字符后停止读取,无论它是否为换行符。因此,使用fgets时,您可能会遇到最多接受6个字符+换行符或7个字符且换行符仍保留在流中的问题,这使得达到确切的最大字符数变得更加困难。@tofro您认为这是为什么?1 MAXCHAR需要调整,它不是一个固定值。2您必须检查并删除尾随的换行符(如果有),然后检查字符串长度,有什么问题?3当一个新行仍然保留在流中时,这不应该引起太多的关注,不是吗?@SouravGosh主要的问题是:一旦用户提供了最大数量的字符,fgets将不会等待用户确认密码-这至少令人恼火,但会导致各种错误。工作,但我永远不会在生产代码中使用它。
password[MAXCHAR] = '\0';
char password[MAXCHAR + 1] = { };
memset(password, '\0', sizeof password);