我的问题是当我尝试保存字符串(series[0]
)时(c[0]
)
我显示它,它总是忽略最后一位数。
例如(series[0]
)=" 1-620"
所以我将此值保存在(c[0]
)
并要求程序显示(c[0]
),它显示" 1-62"并忽略最后一位数字" 0
"。我该如何解决这个问题?
这是我的代码:
#include <stdio.h>
int main(void)
{
int price[20],i=0,comic,j=0;
char name,id,book[20],els[20],*series[20],*c[20];
FILE *rent= fopen("read.txt","r");
while(!feof(rent))
{
fscanf(rent,"%s%s%s%d",&book[i],&els[i],&series[i],&price[i]);
printf("1.%s %s %s %d",&book[i],&els[i],&series[i],price[i]);
i++;
}
c[0]=series[0];
printf("\n%s",&c[0]);
return 0;
}
答案 0 :(得分:0)
使用fscanf和printf是错误的:
fscanf(rent,"%s%s%s%d",&book[i],&els[i],&series[i],&price[i]);
应该是:
fscanf(rent,"%c%c%s%d",&book[i],&els[i],series[i],&price[i]);
当scanf期望一个字符指针时,你在char指针上使用了引用操作符,你也读取了一个字符串来预订,而不是一个字符。
printf("1.%s %s %s %d",&book[i],&els[i],&series[i],price[i]);
应该是:
printf("1.%c %c %s %d",book[i],els[i],series[i],price[i]);
和
printf("\n%s",&c[0]);
应该是:
printf("\n%s",c[0]);
c是一个char *数组,所以c [i]可以指向一个字符串,这就是你要发送给printf函数的内容。
*请记住,在将它们发送到scanf之前,您必须为内存中的所有字符串分配(使用malloc)一个位置:
e.g:
c[0] = (char*)malloc(sizeof(char)*lengthOfString+1);
只有在此之后你才能读到它中的字符。
或者您可以使用固定大小的双字符数组:
c[10][20];
现在c是一个包含20个字符串的数组,最长可达9个字符。
答案 1 :(得分:0)
在其他问题中,最后你有:
c[0]
那里有很多问题。严重的一点是char *
是char *
,因此您将char **
- printf()
- 的地址传递给%s
,但是char *
1}}格式需要char *series[20]
。小问题是你应该用换行符终止输出行。
一般来说,你的内存分配很乱。您没有为#include <stdio.h>
int main(void)
{
int price[20];
int i;
char book[20][32];
char els[20][32];
char series[20][20];
const char filename[] = "read.txt";
FILE *rent = fopen(filename, "r");
if (rent == 0)
{
fprintf(stderr, "Failed to open file '%s' for reading\n", filename);
return 1;
}
for (i = 0; i < 20; i++)
{
if (fscanf(rent, "%31s%31s%19s%d", book[i], els[i], series[i], &price[i]) != 4)
break;
printf("%d. %s %s %s %d\n", i, book[i], els[i], series[i], price[i]);
}
printf("%d titles read\n", i);
fclose(rent);
return 0;
}
指针指定空间,因此在使用时会出现未定义的行为。
您需要确保已分配足够的空间来存储数据,并且很明显您没有这样做。一个小难点是找出数据的样子,但它似乎是一系列的行,每行有3个字和1个数字。这段代码可以更可靠地完成这项工作:
Tixrpsywuqpgdyc Yeiasuldknhxkghfpgvl 1-967 8944
Guxmuvtadlggwjvpwqpu Sosnaqwvrbvud 1-595 3536
Supdaltswctxrbaodmerben Oedxjwnwxlcvpwgwfiopmpavseirb 1-220 9698
Hujpaffaocnr Teagmuethvinxxvs 1-917 9742
Daojgyzfjwzvqjrpgp Vigudvipdlbjkqjm 1-424 4206
Sebuhzgsqpyidpquzjxswbccqbruqf Vuhssjvcjjylcevcisdzedkzlp 1-581 3451
Doeraxdmyqcbbzyp Litbetmttcgfldbhqqfdxqi 1-221 2485
Raqqctfdlhrmhtzusntvgbvotpk Iowdcqlwgljwlfvwhfmw 1-367 3505
Kooqkvabwemxoocjfaa Hicgkztiqvqdjjx 1-466 435
Lowywyzzkkrazfyjuggidsqfvzzqb Qiginniroivqymgseushahzlrywe 1-704 5514
这可以通过无数方式进行调整,但是如上所述,它确保缓冲区没有溢出(通过计数循环和输入转换规范,包括长度),检测何时出现I / O问题或EOF,以及在行尾打印带换行符的数据。它检查并报告它是否无法打开文件(包括文件的名称 - 当名称没有硬编码时非常重要,即使它是一个好主意),并在退出之前关闭文件。
由于您没有提供任何数据,我创建了一些随机数据:
0. Tixrpsywuqpgdyc Yeiasuldknhxkghfpgvl 1-967 8944
1. Guxmuvtadlggwjvpwqpu Sosnaqwvrbvud 1-595 3536
2. Supdaltswctxrbaodmerben Oedxjwnwxlcvpwgwfiopmpavseirb 1-220 9698
3. Hujpaffaocnr Teagmuethvinxxvs 1-917 9742
4. Daojgyzfjwzvqjrpgp Vigudvipdlbjkqjm 1-424 4206
5. Sebuhzgsqpyidpquzjxswbccqbruqf Vuhssjvcjjylcevcisdzedkzlp 1-581 3451
6. Doeraxdmyqcbbzyp Litbetmttcgfldbhqqfdxqi 1-221 2485
7. Raqqctfdlhrmhtzusntvgbvotpk Iowdcqlwgljwlfvwhfmw 1-367 3505
8. Kooqkvabwemxoocjfaa Hicgkztiqvqdjjx 1-466 435
9. Lowywyzzkkrazfyjuggidsqfvzzqb Qiginniroivqymgseushahzlrywe 1-704 5514
10 titles read
上述代码对该数据的输出为:
{{1}}