C字符数组用户输入检查长度

时间:2011-12-14 20:30:20

标签: c arrays scanf

我在char数组中读取scanf,并想检查长度是否大于15。 它有时只起作用。 (如果不是我收到错误 - >核心转储。)

我的代码:

#include <stdio.h>

int checkArray(char string[], int length) {
    int i;
    for(i=0; string[i] != '\0'; i++);
    if(i > length) {
        return -1;
    }
    return 0;
}

int main ()
{
    const int length = 15;
    char x[15];
    scanf("%s", x);
    if(checkArray(x, length) == -1) {
        printf("max. 15 chars!");
        return 1;
    }
    return 0;
}

4 个答案:

答案 0 :(得分:5)

x永远不会(合法地)超过14个字符,因为你有一个大小为15的缓冲区(14个空格用于字符,一个用于NUL终结符),所以尝试检查它是否少于15个字符。

如果您尝试在其中存储大于14的字符串,它将超出阵列并希望导致与您遇到的错误类似的错误。 (可选)使您的数组更大,以便它实际上可以容纳超过15个字符并为%s添加宽度说明符:

char x[30];

scanf("%29s", x); // read a maximum of 29 chars (replace 29 if needed
                  // with one less than the size of your array)

checkArray(x, 15);

答案 1 :(得分:1)

scanf读入长度超过14个字符的字符串时(为null终结符保留一个字符串),它会破坏内存。然后,您的checkArray()方法存在一些问题:

int checkArray(char string[], int length) {
    int i;

    // This next line could as well be a call to `strlen`.
    // But you shouldn't let it access `string` when `i` is >= `length`. 
    for(i=0; string[i] != '\0'; i++);

    // This should be `>=`.  If `i` is 15, you accessed (in the loop above)
    // `string[15]`, which is past the end of the array.
    if(i > length) {
        return -1;
    }

    return 0;
}

答案 2 :(得分:0)

这是经典的缓冲区溢出。您需要限制读取数据的长度:

scanf("%14s", x);

或者,您可以告诉scanf为您分配缓冲区:

char* x;
scanf("%as", &x);
...
checkArray(x, 15);

这将为您提供的任何字符串分配足够长的缓冲区。 (当然对物理内存的限制和向应用程序发送10GB数据的坏人)。

此字符串是动态分配的,因此需要释放它:

free(x);

答案 3 :(得分:0)

而不是返回-1和0返回其他东西,如长度而不是-1而i而不是0,并相应地更改main函数中的条件。 那么程序每次都会输出。(不知道逻辑,但它对我有用)