我在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;
}
答案 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函数中的条件。 那么程序每次都会输出。(不知道逻辑,但它对我有用)