簡體   English   中英

這個簡單的C代碼有什么問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM