gpt4 book ai didi

c - 奇怪的输出总是出现在 MacOS 而不是 Ubuntu

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:25 25 4
gpt4 key购买 nike

我能够让这个 C 程序在 Ubuntu 上正常工作,但在 Mac 上它总是在矩阵的第一行给我一些奇怪的输出。

当我尝试打印 temp[0][k] 时,它弄乱了整行! (你需要一个 file.txt 来运行代码)

#include <stdio.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

int main (void)
{
int fd, sz;
int size; //the nuber of bytes of the file
int index = 0;
int j, m, k, i = 0;
int count, tot = 0;
int plain_counter = 0;
int encoded_counter = 0;

struct stat st;
stat("file_input.txt", &st);
size = st.st_size;

char c[size];
fd = open("file_input.txt", O_RDONLY);
if (fd < 0) { perror("r1"); exit(1); }

sz = read(fd, c, size);
printf("called read(%d, c, %i). returned that" " %d bytes were read.\n", fd, size, sz);
c[sz] = '\0';
printf("Those bytes are as follows: \n%s\n", c);

for (k = 0; k < size; k++)
{
if (c[k] == '\n')
{
index++; //countin how many times the \n appear in the file
}
}

char temp[index][1024]; //array to save modifived lines
char plain[index][512]; //array to save plain lines
char encoded[index][512]; //array to save encoded lines

//Bring the string from C[] to temp[][] omitting < >
for(j = 0 ; j < index; j++)
{
//printf("%i\n", j);
while(c[i] != '\n')
{
//printf("j = %i , k = %i ", j, k);
if(c[i] != '<' && c[i] != '>')
{
temp[j][k] = c[i];
//printf("%c", temp[j][k]); //if i print temp here it's perfect
k++;
}
i++;
}
printf("temp[%i][%i] = %c\n", j, k, temp[j][k]);
temp[j][k] = '\n';
tot += k;
k = 0;
i++;
}

temp[j][tot + 1] = '\0';

//printf("0 0 = %c\n", temp[0][0]);

i = 0;
j = 0;
k = 0;

//i print the temp array to check if it is well made
while(j < index)
{
printf("j = %i, k = %i\n", j, k);
while(temp[j][k] != '\n')
{
printf("%c", temp[j][k]); //the problem occurs here, in temp[0][k]!!
k++;
}
printf("\n");

k = 0;
j++;
}
printf("\n");

//saving the plain text into te plain array and the encoded text into te encoded array
//it works but the first line is a mess (ONLY ON MACOS)
for ( j = 0 ; j < index; j++)
{
count = 0;
i = 0;
k = 0;
m = 0;
while(temp[j][i] != '\n'){
if(temp[j][i] != ';')
{
if (count == 0)
{
plain[j][k] = temp[j][i];
printf("%c", plain[j][k]);
k++;
plain_counter++;
}else{
encoded[j][m] = temp[j][i];
printf("%c", encoded[j][m]);
m++;
encoded_counter++;

}
}
else if(temp[j][i] == ';')
{
printf("\n");
count = 1;
}
i++;
}
printf("\n");
}
plain[j][plain_counter + 1] = '\0';
encoded[j][encoded_counter + 1] = '\0';
return 0;
}

最佳答案

问题是,当您考虑到 read 没有添加 NUL 字符来终止字符串并且您自己添加它时,您不要给数组足够的空间来存储它。所以你只需要在创建数组时增加大小:

char c[size+1];

为了完整起见,您还应该检查 read 的返回值,因为如果有错误,它可能是 -1。

进一步发现了另外几个问题。你有这一行:

temp[j][tot + 1] = '\0';

在这个for循环之后

for(j = 0 ; j < index; j++)

一旦循环结束,j 将超出 temp 的范围。实际上,该行应该在循环内,因为您要将 \0 添加到 temp 中的每个字符串。所以你应该删除它以及你有这条线的地方:

    temp[j][k] = '\n';

添加此行以终止字符串。

    temp[j][k+1] = '\0';

至于k,我看不到任何迹象表明它在这个循环之前设置为0。你只是在最后将它重置为 0,所以第一次 k 可以包含任何值。将 k=0 移动到循环中发生的第一件事。

可能很容易出现其他类似的问题 - 这是使用 valgrind 调试代码的一个非常好的主意,因为它会告诉您这些类型的错误发生在哪里。

关于c - 奇怪的输出总是出现在 MacOS 而不是 Ubuntu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50531854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com