在C中遍历字符串

在C中遍历字符串,c,string,loops,file-io,C,String,Loops,File Io,在我的代码中,我从文件中读取逗号分隔的值。我使用remove函数删除逗号。我遇到的问题是遍历字符串。我觉得我用来迭代字符串的for循环是正确的,但我可能做了一些非常愚蠢的事情,因为程序失败得很惨。那么,如何正确地遍历字符串呢 文件中的每一行的格式类似于: 0000000000001110,1 这是我的密码: #include <stdio.h> #include <stdlib.h> void removeChar(char *str, char garbage);

在我的代码中,我从文件中读取逗号分隔的值。我使用remove函数删除逗号。我遇到的问题是遍历字符串。我觉得我用来迭代字符串的
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';
}
#包括
#包括
void removeChar(char*str,char垃圾);
int main(){
文件*ifp;
char*mode=“r”;
ifp=fopen(“in.csv”,模式);
字符*字符串;
int i,len;
while(fscanf(ifp,“%s”,字符串)!=EOF){
removeChar(字符串“,”);
printf(“%s\n”,string);//提供不带逗号的字符串的正确输出
len=strlen(字符串);

对于(i=0;i您已将
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;
    }
    
    intmain(){
    文件*ifp;
    char*mode=“r”;
    ifp=fopen(“in.csv”,模式);
    //使用字符数组。
    字符字符串[1024];
    int i,len;
    //使用FGET而不是fscanf。
    while(fgets(字符串,1024,ifp)!=NULL){
    removeChar(字符串“,”);
    printf(“%s\n”,string);//提供不带逗号的字符串的正确输出
    len=strlen(字符串);
    
    对于(i=0;i在继续fscanf之前,为指针
    char*string;
    提供有效内存

    否则,像这样试试


    字符字符串[1000];
    //这里的字符串是字符数组。

    粘贴另一个解决方案。它过滤输入字符,在读取大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);
    }
    
    #包括
    #定义行\u MAXLEN(1024)
    静态尺寸
    读线(字符*buff,文件*fp)
    {
    寄存器字符c;
    char*p=buff;
    而((c=fgetc(fp))>43)如果(c>47)*p++=c;//ord(',')==44和ord('0')==48
    *p=0;
    返回(p-buff);
    }
    int
    主(空)
    {
    字符行[line_MAXLEN];
    文件*fp;
    if((fp=fopen(“in.csv”,“r”))==NULL)
    perror(“打开文件时出错”);
    while(readline(line,fp))
    printf(“行=%s\n”,行);
    返回(0);
    }
    
    您会遇到什么错误?@haris实际上没有错误,程序只是崩溃了。我已经能够使用相同的方法在不同的程序中迭代字符串。我不知道这里有什么不同导致了错误。您需要使用
    malloc()为
    字符串
    分配内存
    。否则,它只是一个指向随机位置的指针。将
    char*string;
    替换为
    char string[MAXLEN];
    其中MAXLEN是in.csv中行的最大长度。