迭代C中的字符串

时间:2014-10-03 07:04:12

标签: c string loops file-io

在我的代码中,我正在从文件中读取逗号分隔值。我使用删除函数删除逗号。我遇到问题的地方是遍历字符串。我觉得我用来迭代字符串的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';
}

3 个答案:

答案 0 :(得分:3)

您已将string定义为:

char* string;

但是在使用它来从文件中读取数据之前,你没有为它分配内存。这导致了不确定的行为。

建议:

  1. 使用数组。
  2. 使用fgets代替fscanffgetsfscanf更安全,因为您指定了要读取的最大字符数。
  3. 以下是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);
}