我对C很陌生,我想我会学到更多。我正在尝试编写一些代码来读取预先存在的文本文件并格式化并将其写入磁盘。当它编译时,每当我不确定是否应该得到一个片段错误时,我都会得到一个片段错误。我翻阅了大部分的手册页,却找不到任何突出的地方。
下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *file = fopen("listing.txt","r"), *output;
char *fvar;
char *svar;
char delim[] = ",";
int num;
char ch;
char line[66];
int listnum = 0;
if(file == NULL){
printf("Cannot open file.\n");
exit(1);
}
output = fopen("report.txt","w");
fprintf(output, "%s", "First Name Last Name Number ");
fprintf(output, "%s", "-------------------------------------");
while(fgets(line, 66, file) != NULL){
ch = line[0];
if((ch >= 'a') && (ch <= 'z')){
fvar = strtok(line,delim);
svar = strtok(NULL,delim);
listnum++;
}
else {
num = atoi(line);
}
fprintf(output, "%s", fvar);
fprintf(output, "%15s", svar);
fprintf(output, "%30d", num);
fprintf(output, "%56s", "\n");
}
fclose(file); /* done reading from the input file */
fclose(output); /* done writing the the output file */
return 0;
}我要做的是读取文本文件的一行。如果该行以"string,string“的方式包含信息,则将这两个信息标记化,并将它们分别存储在fvar和svar中。如果是数字字符串,则使用atoi()获取值并将其存储在num中。
由于某些原因,这会导致分段错误,尽管它编译得很好。我很确定问题在fvar = strtok(temp,delim);和svar = strtok(NULL,delim);两行中,但我不知道如何修改它。注意:如果我使用fvar = strtok(line,delim);,也会发生相同的行为。
编辑:修正,谢谢克里斯·多德。按照我自己的意愿,我会去拿一本一年级的课本,再研究一下我的字母表。
发布于 2011-12-03 22:48:00
最可能的问题是,您的第一个输入行不以小写字母开头,所以您从不首先调用strtok,也从不将其赋值给svar或fvar,但仍然将这些(未初始化的)值传递给printf,而printf则会产生分段错误……
尝试使用调试器对代码进行单步执行,以查看代码的实际用途。
发布于 2011-12-03 22:32:09
strtok可以返回空。如果忽略这种可能性,访问冲突很容易导致。始终检查您调用的函数的返回状态。
fvar = strtok(temp, delim);
if (fvar != NULL)
{
printf("%s\n", fvar);
svar = strtok(NULL, delim);
if (svar != NULL)
{
printf("%s\n", svar);
}
else
{
/* illegal to access contents of svar */
}
}
else
{
/* illegal to access contents of fvar */
}与问题无关的/*,您可能会发现包含文件ctype.h .h很有用,因为它提供了一个表单.的函数族.手推器,字母,数字等等。
https://stackoverflow.com/questions/8371538
复制相似问题