如何检查C中输入字符串的长度

时间:2018-05-28 09:46:41

标签: c string string-length

我有这个功能,检查字符串是否为:

void get_string(char *prompt, char *input, int length)
{
    printf("%s", prompt);                                   
    fgets(input, length, stdin);
    if (input[strlen(input) - 1] != '\n')
    {
        int dropped = 0;
        while (fgetc(stdin) != '\n')
        {
            dropped++;
        }
        if (dropped > 0)
        {
            printf("Errore: Inserisci correttamente la stringa.\n");
            get_string(prompt, input, length);
        }
    }else{
        input[strlen(input) - 1] = '\0';
    }
    return;
}

使用此功能,只有当字符串长于length时,我才能重复输入。

如果我还必须检查字符串是否更短,我该怎么办?

2 个答案:

答案 0 :(得分:3)

如果字符串较短,button. addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); function mouseDownHandler(event:MouseEvent):void { navigateToURL(new URLRequest("https://website.com/")); } button2. addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); function mouseDownHandler2(event:MouseEvent):void { navigateToURL(new URLRequest("https://anotherwebsite.com/")); } button3. addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); function mouseDownHandler3(event:MouseEvent):void { navigateToURL(new URLRequest("https://yetanotherwebsite.com/")); } 负责处理。缓冲区不会被填满,换行符将被放置在字符串的末尾。

只需在fgets之后检查strlen(input) < length。如果该条件的计算结果为true,则读取的值小于缓冲区大小可能产生的最大字节数。

答案 1 :(得分:0)

OP的代码受黑客攻击,可能会导致未定义的行为

// What happens if the first character read is a null character?
fgets(input, length, stdin);
if (input[strlen(input) - 1] != '\n')

fgets()读取输入时,输入 空字符并不特殊。它像任何其他角色一样被阅读和保存。

如果出现这种病态,input[0] == 0strlen(input) - 1SIZE_MAXinput[SIZE_MAX]肯定是数组边界外的访问,因此未定义的行为

如果fgets()未读取所有行,则测试是将最后一个缓冲区字符设置为非零,然后测试它是否为0。

assert(input && length > 1);

input[length - 1] = '\n';

// check `fgets()` return value
if (fgets(input, length, stdin) == NULL) {
  return NULL;
}

if (input[length - 1] == '\0' && input[length - 2] != '\n') {
  // more data to read.