在我的代码中,我正在从文件中读取逗号分隔值。我使用删除函数删除逗号。我遇到问题的地方是遍历字符串。我觉得我用来迭代字符串的for
循环是正确的,但我可能做了一些非常愚蠢的事情,因为程序失败了。那么,我如何正确地遍历字符串呢?
文件中的每一行的格式类似于:
0000000000001110,1
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
void removeChar(char *str, char garbage);
int main(){
FILE *ifp;
char *mode = "r";
ifp = fopen("in.csv", mode);
char* string;
int i, len;
while(fscanf(ifp, "%s", string)!=EOF){
removeChar(string, ',');
printf("%s \n", string); //gives me correct output of string with no comma
len = strlen(string);
for(i=0; i<len; i++) //where the error occurs
printf("%c", string[i]);
}
return 0;
}
void removeChar(char *str, char garbage) {
char *src, *dst;
for (src = dst = str; *src != '\0'; src++) {
*dst = *src;
if (*dst != garbage) dst++;
}
*dst = '\0';
}
答案 0 :(得分:3)
您已将string
定义为:
char* string;
但是在使用它来从文件中读取数据之前,你没有为它分配内存。这导致了不确定的行为。
建议:
fgets
代替fscanf
。 fgets
比fscanf
更安全,因为您指定了要读取的最大字符数。以下是main
的更新版本。
int main(){
FILE *ifp;
char *mode = "r";
ifp = fopen("in.csv", mode);
// Use an array of char.
char string[1024];
int i, len;
// Use fgets instead of fscanf.
while(fgets(string, 1024, ifp) != NULL) {
removeChar(string, ',');
printf("%s \n", string); //gives me correct output of string with no comma
len = strlen(string);
for(i=0; i<len; i++) //where the error occurs
printf("%c", string[i]);
}
return 0;
}
答案 1 :(得分:1)
在继续执行fscanf之前,为指针char* string;
提供有效的内存。
否则,请尝试这样
char string[1000];
//这里的字符串是字符数组。
答案 2 :(得分:1)
粘贴另一种解决方案。它可以过滤输入字符,读取大型CSV文件时非常快。
#include<stdio.h>
#define LINE_MAXLEN (1024)
static size_t
readline(char *buff, FILE *fp)
{
register char c;
char *p = buff;
while ((c = fgetc(fp)) > 43) if (c > 47) *p++ = c; // ord(',') == 44 and ord('0') == 48
*p = 0;
return (p - buff);
}
int
main(void)
{
char line[LINE_MAXLEN];
FILE *fp;
if ((fp = fopen("in.csv", "r")) == NULL)
perror("Error opening file");
while (readline(line, fp))
printf("line=%s\n", line);
return (0);
}