Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不使用strlen时strlen的分段错误?_C_Arrays_String_Segmentation Fault_Strlen - Fatal编程技术网

C 不使用strlen时strlen的分段错误?

C 不使用strlen时strlen的分段错误?,c,arrays,string,segmentation-fault,strlen,C,Arrays,String,Segmentation Fault,Strlen,我有一些代码,它获取一个文件,将每一行读入一个新的字符串数组(每个字符加128),然后将每个数组分配到一个指针数组,然后打印每个数组。在尝试运行代码时,我收到一个错误,指出分段错误,原因是: strlen()位于../sysdeps/x86_64/strlen.S:106 106../sysdeps/x86_64/strlen.S:没有这样的文件或目录。 但我从来没有在我的密码里给斯特伦打过电话 #include <stdio.h> #include <assert.h>

我有一些代码,它获取一个文件,将每一行读入一个新的字符串数组(每个字符加128),然后将每个数组分配到一个指针数组,然后打印每个数组。在尝试运行代码时,我收到一个错误,指出分段错误,原因是:

strlen()位于../sysdeps/x86_64/strlen.S:106
106../sysdeps/x86_64/strlen.S:没有这样的文件或目录。

但我从来没有在我的密码里给斯特伦打过电话

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define ROW 10
#define COL 40
#define ARGS 2
#define FLIP_VALUE 128

char** read_file (char* argv[], char **array_pointers);
char* new_array (void);
void print_strings (char** array_pointers);

int main(int argc, char* argv[])
{
    char **array_pointers = NULL;
    if (argc == ARGS)
    {
        array_pointers = read_file(&argv[1], array_pointers);
        print_strings(array_pointers);
    }
return 0;
}

char** read_file (char* argv[], char **array_pointers)
{
    FILE* file_name;
    int i = 0, j = 0;
    char c;
    char *temp_array;
    array_pointers = malloc(sizeof(char*) * ROW);
    file_name = fopen(argv[0], "r"); 
    assert(file_name);
    if (file_name) /* if file is not null */
    {
        while (c != EOF) /* while not equal to end of file */
        {
            for (j = 0; j < ROW; j++) /* for each row */
            {
            temp_array = new_array(); /* generate a new array for each new string (row) */
                for (i = 0; i < COL; i++) /* for each char in a row */
                {
                    c = fgetc(file_name);
                    temp_array[i] = c + FLIP_VALUE;
                }
            array_pointers[j] = temp_array; /*assign array pointers to point at each new temp_array */
            }   
        }
    }
    return array_pointers;
}

char* new_array (void)
{
    char* temp;
    temp = malloc(sizeof(char) * COL);
    assert(temp);
    return temp;    
}           

void print_strings (char** array_pointers)
{
    int i = 0;
    for (i = 0; i < COL; i++)
    {
        printf("%s\n",array_pointers[i]);
    }
}
#包括
#包括
#包括
#定义第10行
#定义第40列
#定义ARGS 2
#定义翻转U值128
char**read_文件(char*argv[],char**array_指针);
char*新的_数组(void);
无效打印字符串(字符**数组指针);
int main(int argc,char*argv[])
{
字符**数组\指针=空;
如果(argc==ARGS)
{
数组指针=读取文件(&argv[1],数组指针);
打印字符串(数组指针);
}
返回0;
}
char**read_文件(char*argv[],char**array_指针)
{
文件*文件名;
int i=0,j=0;
字符c;
字符*临时数组;
数组指针=malloc(sizeof(char*)*行);
文件名=fopen(argv[0],“r”);
断言(文件名);
如果(文件名)/*如果文件不为空*/
{
while(c!=EOF)/*而不等于文件末尾*/
{
对于(j=0;j
完整堆栈跟踪的内容如下:

#1  0x00007ffff7a84e3c in _IO_puts (str=0x0) at ioputs.c:36
        result = -1
        len = <optimised out>
#2  0x0000000000400806 in print_strings (array_pointers=0x602010)
    at array_of_string_arrays.c:65
        i = 10
#3  0x00000000004006a1 in main (argc=2, argv=0x7fffffffdff8)
    at array_of_string_arrays.c:19
        array_pointers = 0x602010
#1 0x00007ffff7a84e3c在ioputs处的输入输出(str=0x0)。c:36
结果=-1
len=
#打印字符串中的2 0x0000000000400806(数组指针=0x602010)
在字符串数组的数组中。c:65
i=10
#3 0x00000000004006a1在主屏幕中(argc=2,argv=0x7FFFFFFFF8)
在字符串数组的数组中。c:19
数组_指针=0x602010
之后

temp = malloc(sizeof(char) * COL); 
你应该

memset(temp,0,sizeof(char) * COL);

因为
strlen
print\u strings
中通过读取
0
来结束,所以您可以使用
printf(“%s”,str)打印字符串。这要求字符串以null结尾。如果正在读取普通文本文件,则写入的字符串不会以null结尾。您需要将终止的空字节添加到您读取的字符串中-或者您不能使用
printf


出现崩溃的原因是您的
printf
似乎在打印字符串之前先检查字符串的长度(使用
strlen
strlen
递增字符指针,直到它读取空字节。由于字符串中没有任何字符,
strlen
读取缓冲区,最后读取内存中的某个空字节,如果不允许读取该内存,则会崩溃。

这里实际上有几个错误:

  • read_文件
    中,
    c
    最初与
    EOF
    比较时未定义。你需要这个外环吗

  • 您应该在
    fgetc
    返回后立即检查其结果,以查看其是否为
    EOF

  • 您正在为每行的每个字符分配一个新的
    temp_数组
    ,而不是为每行分配一次。这需要向上移动到包含循环中


  • print\u strings
    中,您正在对行进行迭代,因此应该将循环索引与
    进行比较,而不是与
    进行比较

  • 打印行时,您正在
    printf
    中使用
    %s
    。不能这样做,因为不能保证行中的字符以null结尾。您可以通过分配一个额外的字符并在其中存储
    '\0'
    来强制它们,或者您可以在格式说明符中包含一个长度字段来限制长度(您可以使用
    *
    将其作为参数传递)


  • 我怀疑最后一个bug是导致分段错误的bug。

    建议您在调试器中运行程序,并至少获得完整的堆栈跟踪。
    c
    应该是
    int
    ,否则
    while(c!=EOF)
    永远不会是
    false
    。您还为每个
    char
    创建了一个新数组,而不是为每个新字符串。看起来for循环中的条件必须是
    j
    i
    your
    ,而(c!=EOF)
    循环是错误的。请参阅将
    128
    添加到字符串中的每个
    char
    ,然后尝试使用
    “%s”打印该字符串。
    将不会打印可读的内容。或者使用
    calloc()
    或将分配给0的第一个(或最后一个)字节设置为0。将整个数组设置为零通常是一个很好的简单实践,但坦率地说,很少需要这样做