在C中遍历字符串
在我的代码中,我从文件中读取逗号分隔的值。我使用remove函数删除逗号。我遇到的问题是遍历字符串。我觉得我用来迭代字符串的在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);
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中行的最大长度。