在字符串中存储字符串?

时间:2016-06-09 23:32:50

标签: c

我的问题是当我尝试保存字符串(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;
}

2 个答案:

答案 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}}