[英]What's wrong with this simple C code?
#include <stdio.h>
int main()
{
int m,n; scanf("%d %d",&m,&n);
char ar[m][n];
char buf[n];
int a,b;
for(a=0;a<m;a++)
{
gets(buf);
for(b=0;b<n;b++) ar[a][b] = buf[b];
}
for(a=0;a<m;a++,printf("\n")) for(b=0;b<n;b++) printf("%c",ar[a][b]);
return 0;
}
此代码将m行作为来自stdin
,每行包含n个字符,并将所有行打印到stdout
。 就那么简单。 但是似乎有内存泄漏,因为第一次gets(buf)
时,将跳过其执行。
我也在C ++中尝试过,认为内存泄漏将消失。 这是代码:
#include <cstdio>
using namespace std;
int main()
{
int m,n; scanf("%d %d",&m,&n);
char **ar = new char*[m];
char *buf = new char[n];
int a,b;
for(a=0;a<m;a++)
{
gets(buf);
ar[a] = new char[n];
for(b=0;b<n;b++) ar[a][b] = buf[b];
}
for(a=0;a<m;a++,printf("\n")) for(b=0;b<n;b++) printf("%c",ar[a][b]);
return 0;
}
但它的行为完全相同。
这是一些示例输入和输出:
2 3
abc
def
输出:
x��
abc
GDB似乎也没有显示任何内容。 请帮忙..
这不是“内存泄漏”。 问题在于,第一个gets()
调用从您在第一行中输入两个维度时开始读取换行符。 它将零个字符放入缓冲区,但是您输出5,这就是为什么会出现一行垃圾的原因。
在scanf()
格式字符串的末尾添加“ \\ n”,以便scanf()
使用换行符,并且您的程序将正常运行。 注意, gets()
非常不安全; 最好使用fgets(buf, n, stdin)
。
除了在scanf()
缺少'\\n'
,您还应该为buf
分配更多空间:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m,n;
if(scanf("%d%d\n",&m,&n) != 2)
exit(EXIT_FAILURE);
char ar[m][n];
char buf[n+2]; // '\n\0'
int a,b;
for(a=0;a<m;a++)
{
if (!fgets(buf, n+2, stdin)) exit(EXIT_FAILURE);
for(b=0;b<n;b++) ar[a][b] = buf[b];
}
for(a=0;a<m;a++,printf("\n")) for(b=0;b<n;b++) printf("%c",ar[a][b]);
return 0;
}
abc
def
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.