C printf(%s),字符串问题。。。本质上,%s正在导致行覆盖。

C printf(%s),字符串问题。。。本质上,%s正在导致行覆盖。,c,C,好吧,为了对正在发生的事情有一个合理的了解 我正在将csv表中的数据读取到二维数组中,如下所示: tableFile = fopen(argv[4], "r"); char tableArray[30][50][256]; char c; int i=0, j=0, k=0; while(c != EOF){ c = fgetc(tableFile); switch(c) { case ',': tableArray[i][j+

好吧,为了对正在发生的事情有一个合理的了解

我正在将csv表中的数据读取到二维数组中,如下所示:

tableFile = fopen(argv[4], "r");
char tableArray[30][50][256];
char c;
int i=0, j=0, k=0;
while(c != EOF){

    c = fgetc(tableFile);

    switch(c)
    {
        case ',':
            tableArray[i][j++][k]='\0';
            k=0;
            break;
        case '\n':
            tableArray[i++][j][k]='\0';
            j=0;
            k=0;
            break;
        default:
            tableArray[i][j][k++] = c;
            break;
    }
} //end file transfer

fclose(tableFile);
在读了文件之后,我做了一堆无关紧要的垃圾,但问题是当我去打印从上述表格中获取的数据时,printf会发疯

例如,如果我试着说类似的话

 char *string = malloc(256*sizeof(char));
 string = tableArray[9][46];
 printf("What the heck is going on with this string %s ", string);
看到%s后面的空格了吗?它实际上会覆盖“W”,并且printf会显示类似“这个强HELLO到底是怎么回事”

有什么想法吗


谢谢

您的读入行以
'\r'
结尾。您应该特别在
开关中处理
'\r'
案例您的读入行以
'\r'
结尾。您应该特别在您的
开关中处理
'\r'
大小写文件有CR(
'\r'
)字符,您将它们放在子字符串的末尾。

文件有CR(
'\r'
)字符,并将它们放在子字符串的末尾。

该字符串可能类似于
“HELLO\r”
。回车将光标移到行的开头。

字符串可能类似于
“HELLO\r”
。回车将光标移到行的开头。

在输入文件中,行是如何终止的


如果您使用的是Windows行尾转换,即
\r\n
,则必须在交换机中也跳过
\r

输入文件中的行是如何终止的


如果您使用的是Windows线端转换,即
\r\n
,则必须在交换机中也跳过
\r

次要问题:您的
malloc
是不必要的,并且正在泄漏内存。Windows输入由
“\r\n”
组成。从输出字符串中删除
'\r'
getc
返回一个int而不是char。我认为您对C非常陌生,因为我认为您希望从tableArray[9][46]复制字符串,而不是指向它。如果只使用
printf(“%s\n”,string),printf会说什么?当您点击EOF时,您的代码进入
default:
语句,并将
EOF
的值写入
tableArray
。您需要在switch语句中明确说明
EOF
的大小写,以避免出现这种情况,或者在
fgetc
返回后立即添加对
EOF
的检查。次要问题:您的
malloc
是不必要的,并且正在泄漏内存。Windows输入由
“\r\n”
组成。从输出字符串中删除
'\r'
getc
返回一个int而不是char。我认为您对C非常陌生,因为我认为您希望从tableArray[9][46]复制字符串,而不是指向它。如果只使用
printf(“%s\n”,string),printf会说什么?当您点击EOF时,您的代码进入
default:
语句,并将
EOF
的值写入
tableArray
。您需要在switch语句中为
EOF
指定一个明确的大小写,以避免出现这种情况,或者在
fgetc
返回后立即添加一个对
EOF
的检查。另外请注意,
printf
是缓冲的,通常需要
\n
来刷新。显然就是这么简单。太神了我所要做的就是在开关上添加几个箱子,基本上忽略了回车和EOF,一切都很好。哎呀!我花了很长时间想弄清楚到底发生了什么。你们中有几个人在这条轨道上。非常感谢您的支持。还要注意,
printf
是缓冲的,通常需要
\n
刷新。很显然,就是这么简单。太神了我所要做的就是在开关上添加几个箱子,基本上忽略了回车和EOF,一切都很好。哎呀!我花了很长时间想弄清楚到底发生了什么。你们中有几个人在这条轨道上。非常感谢您的支持。