使用fscanf进行分段故障 - 不分配内存问题

时间:2017-02-18 10:31:43

标签: c segmentation-fault scanf

我正在尝试制作此代码,以便从文件中读取希腊字母并使用fscanf打印发出相同声音的英文字母。问题是我一直在分段错误。我错过了什么?

#include <stdio.h>

int main ()
{            
    char s[100];    
    int i;
    FILE * myfile;

    myfile = fopen("/home/angelos/Downloads/λεξικο2.txt", "r");

    while( fscanf(myfile, "%s", s) == 1)
        {   
            for (i=0 ; i<100 ; i++)
                { 
                    if ( s[i] == 'Α' )
                        { printf("A") ; }
                    else
                     if ( s[i] == 'Β' )
                        { printf("V") ; }
        }
}

1 个答案:

答案 0 :(得分:1)

您的代码存在3个严重问题。

1)您永远不会检查fopen是否成功。

2)您可以阅读未初始化的签名数据。

3)您可能会溢出输入缓冲区

这三件事都可能导致您的程序失败。

尝试以下更改:

#include <stdio.h>
#include <string.h>

int main ()
{            
    char s[100];    
    int i;
    FILE * myfile;

    myfile = fopen("/home/angelos/Downloads/λεξικο2.txt", "r");

    // Check that fopen went fine
    if (!myfile)
    {
         printf("Failed to open file\n");
         return 1;
    }

    while( fscanf(myfile, "%99s", s) == 1)
                         // ^^
                         // Never read more than 99 chars (i.e. 99 + a terminating null byte)
        {   
            for (i=0 ; i<strlen(s) ; i++)
                      // ^^^^^^
                      // Only iterate over the valid chars
                { 
                    if ( s[i] == 'Α' )
                        { printf("A") ; }
                    else
                     if ( s[i] == 'Β' )
                        { printf("V") ; }
        }
}