user-0 提问: 新手请教关于scanf()函数越界的问题

回复:
user: user-1
content: 引用 10 楼 zhao4zhong1 的回复:[quote=引用 9 楼 colddown 的回复:] 楼主可以看下scanf的manpage. 用%ms可以动态分配内存。       o      An optional 'm' character.  This is used with string conversions (%s, %c, %[), and relieves the caller of               the need to allocate a corresponding buffer to hold the input: instead, scanf()  allocates  a  buffer  of               sufficient  size,  and  assigns  the  address of this buffer to the corresponding pointer argument, which               should be a pointer to a char * variable (this variable does not need to be initialized before the call).               The caller should subsequently free(3) this buffer when it is no longer required.  #include <stdio.h> #include <stdlib.h>  int main() {     char *str;     scanf("%ms", &str);     printf("%s\n", str);     free(str);     return 0; }  试试在这个程序运行时，粘贴一个4GB字节的字符串。[/quote] 改成下面这样应该可以防止内存不足。 #include <stdio.h> #include <stdlib.h>  int main() {     char *str;     scanf("%5ms", &str);     printf("%s\n", str);     free(str);     return 0; }

user: user-2
content: 引用 9 楼 colddown 的回复:楼主可以看下scanf的manpage. 用%ms可以动态分配内存。       o      An optional 'm' character.  This is used with string conversions (%s, %c, %[), and relieves the caller of               the need to allocate a corresponding buffer to hold the input: instead, scanf()  allocates  a  buffer  of               sufficient  size,  and  assigns  the  address of this buffer to the corresponding pointer argument, which               should be a pointer to a char * variable (this variable does not need to be initialized before the call).               The caller should subsequently free(3) this buffer when it is no longer required.  #include <stdio.h> #include <stdlib.h>  int main() {     char *str;     scanf("%ms", &str);     printf("%s\n", str);     free(str);     return 0; }  试试在这个程序运行时，粘贴一个4GB字节的字符串。

user: user-2
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-3
content: scanf很容易出现越界错误，虽然有时运行正常

user: user-1
content: 楼主可以看下scanf的manpage. 用%ms可以动态分配内存。       o      An optional 'm' character.  This is used with string conversions (%s, %c, %[), and relieves the caller of               the need to allocate a corresponding buffer to hold the input: instead, scanf()  allocates  a  buffer  of               sufficient  size,  and  assigns  the  address of this buffer to the corresponding pointer argument, which               should be a pointer to a char * variable (this variable does not need to be initialized before the call).               The caller should subsequently free(3) this buffer when it is no longer required.  #include <stdio.h> #include <stdlib.h>  int main() {     char *str;     scanf("%ms", &str);     printf("%s\n", str);     free(str);     return 0; }

user: user-4
content: 引用 楼主 u010808841 的回复:如下面的代码所示，longNum1 ，longNum2都只是分配了一个10大小的空间，但是实际无论输入多长的字符，都是不会报错，而且输出和出入结果一样。         我的问题是：  scanf()函数可以根据实际的输入字符长度动态分配空间吗？如果是这样，是不是当需要输入字符串的时候只要先分配一个char的空间char *longNum1 = (char*)malloc(sizeof(char));，然后scanf("%s",longNum1);就可以了。如果不是，是不是和我的编译环境有关，我的环境是eclipse+centos  #include <stdio.h> #include<stdlib.h> int main() { 	char *longNum1 = (char*)malloc(10); 	char *longNum2 =  (char*)malloc(10); 	scanf("%s",longNum1); 	scanf("%s",longNum2); 	printf("%s\n",longNum1); 	printf("%s\n",longNum2); 	return 0; } char *longNum1 = (char*)malloc(sizeof(char));之后你scanf("%s",longNum1);明显是错误的，%s是字符串格式输入字符，字符串自带'\0'，至少都是两个字符，只申请了一个字符的空间来输入字符串，明显是错误的。

user: user-5
content: scanf 不会越界提示，如果你输入的长度超出定义的长度，它会自动截断，只保留长度范围内的那部分。 如果你想有数据越界提示，可以调用标准输入函数  fgets(a,sizeof(a),stdin)。   a是输入后用来保存的数组名，  sizeof（a）是长度，stdin表示从标准输入设备输入（也就是键盘啦）。 这样你如果输入的长度超过了数组a定义的长度，就会错误提示，也不能继续输入啦。

user: user-2
content: #include <stdio.h> #include <stdlib.h> int main() {     char *longNum1;     char *longNum2;     longNum1 = (char*)malloc(10);     if (NULL==longNum1) return 1;     longNum2 = (char*)malloc(10);     if (NULL==longNum2) {free(longNum1); return 2;}     scanf("%9s",longNum1);     scanf("%9s",longNum2);     printf("[%s]\n",longNum1);     printf("[%s]\n",longNum2);     free(longNum2);     free(longNum1);     return 0; }

user: user-2
content: #include <stdio.h> #include <stdlib.h> int main() {     char *longNum1 = (char*)malloc(10);     char *longNum2 =  (char*)malloc(10);     scanf("%9s",longNum1);     scanf("%9s",longNum2);     printf("%s\n",longNum1);     printf("%s\n",longNum2);     return 0; }

user: user-6
content: 这时你应该用getch来替代scanf了，用getch来记录输入的个数，不超过设定值的才放到字符数组里

user: user-7
content: scanf()函数不会输入字符长度动态分配空间 scanf输入太长数据时会越界操作