【问题标题】:Array of pointers and file I/O in CC中的指针数组和文件I/O
【发布时间】:2018-03-03 07:39:30
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *strs[6], array[100];
    int i;
    FILE *file  = fopen("random.txt", "r");

    for (i=0 ; i<6; i++)
    {
        fscanf(file ,"%s", array);
        strs[i]= array;

        printf("%s ", strs[i]);
    }

    printf("%s", strs[3]);

    return 0;
}

random.txt里面:

一二三四五六

输出是: 一二三四五六六

我的问题是为什么最后一个“六”,我无法访问第三个元素“四”。为什么不将它们记录在 char 指针数组中?

【问题讨论】:

  • strs[i]= array; -> strs[i]= strdup(array); 如果没有strdup 使用malloc/memcpy 得到相同的。这里所有的指针都指向数组,并且该数组最后包含six。

标签: c


【解决方案1】:

问题是指针数组中的所有元素,即strs,都指向array。换句话说——strs[0]指向array,strs[1]指向array,strs[2]指向array等等。

因此,当您更改 array 时,strs 中的所有元素都指向新值。

可以通过多种方式修复,但最简单的方法是:

//char *strs[6], array[100];
char strs[6][100];

和

// fscanf(file ,"%s", array);
// strs[i]= array;
fscanf(file ,"%s", strs[i]);

但是,请注意您的代码没有检查缓冲区溢出(这很糟糕)。我会推荐你​​阅读fgets

【讨论】:

    【解决方案2】:

    你应该使用 string.h 库中的 strcpy

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main()
    {
        char strs[6][100] , array[100];
        int i;
        FILE *file  = fopen("random.txt", "r");
    
        for (i=0 ; i<6; i++)
        {
            fscanf(file ,"%s", array);
            strcpy(strs[i], array) ;
    
            printf("%s ", strs[i]);
        }
    
        printf("%s", strs[3]);
    
        return 0;
    }
    

    【讨论】:

    • 这会调用未定义的行为。您正在为strcpy() 的目标使用不确定的指针。 char strs[6][100],或者使用动态分配来解决这个问题。它仍在乞求缓冲区溢出,但至少从一开始就不会是 UB。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2012-07-05
    • 2010-10-14
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多