【问题标题】:How to use fscanf to put strings into an array?如何使用 fscanf 将字符串放入数组中?
【发布时间】:2016-11-02 22:00:40
【问题描述】:

所以我使用fscanf 从文件中读取数据,并尝试将这些字符串放入数组中。它似乎有效,但我只是将最后一个字符串放入我的数组中。当我尝试打印它时,我只打印我最后一个字符串的字符。我没有包含我的方法,因为它不会影响 fscanf 的作用,以防万一有人感到困惑。此外,我的 CMDLINE 文件具有以下字符串 foo barr tar 526-4567 456-8792

输出是:

456-8792
56-8792
6-8792

等等……

2

代码如下:

int main (int argC, char *argV[]) {
    FILE *fp;
    int index;
    int ret;
    char str[1000];

    //Need at least 2 files to begin program
    if (argC < 3) {
        fprintf(stderr, "Usage: %s file\n", argV[0]);
        exit(1);
    }//if statemtn

    //check to see if the CMDLINE file is in the arguements
    ret = scanC(argC, argV);

    //if no CMDLINE file is found, print error and exit
    if (ret == 1) {
        fprintf(stderr, "you must provide a CMDLINE file\n");
        exit(1);
    }

    //iterate and open CMDLINE file and read from it
    for (index = 0; index < argC; index++) {
        if (strcmp(argV[index], "CMDLINE") == 0) {
            fp = fopen(argV[index], "r");
            //error check
            if (fp == NULL) {
                fprintf(stderr, "Counld not open file %s\n", argV[index]);
                exit(1);
            }//if statment

            //read from fscanf and put it's arguements into an array
            while (!feof(fp)) {
                char *p2 = str;
                //scan the strings of the file into str array
                while (fscanf(fp, "%s", p2) != EOF) {
                    p2++;
                }//while loop 2
            }//while lop 1

            //close the file for it is not needed to be open anymore
            fclose(fp);
        }//if statement
    }//for looop

    char *p;
    p = str;
    int j;
    for (j = 0; j < strlen(str); j++) {
        printf("%s\n", p);
        p++;
    }
    return 1;
}

【问题讨论】:

标签: c arrays file pointers scanf


【解决方案1】:
char *p;
p = str;
int j;
for (j = 0; j < strlen(str); j++) 
{
    printf("%s\n", p);
    p++;
}

您有一个字符串,例如"abcd",您可以将其打印为printf("%s\n", str);,而不是打印从不同偏移量开始的相同字符串。结果如下:

abcd
bcd
cd
d

也许你对“字符数组”和“字符串数组”感到困惑

//This will reserve 100 character arrays, or 100 strings
char *arr[100];

int count = 0;
while (fscanf(fp, "%999s", str) == 1)
{
    arr[count] = malloc(strlen(str) + 1);
    strcpy(arr[count], str);
    count++;
    if (count == 100)
        break;
}

int i;
for (i = 0; i < count; i++) 
    printf("%s\n", arr[i]);

在实际应用中,您使用mallocrealloc 分配足够大的字符串数组以读取文件。

【讨论】:

    【解决方案2】:

    您可以使用标记来设置“当前字符”:

    char *p2 = str;
    size_t k = 0;
    size_t pos = 0;
    //scan the strings of the file into str array at position pos
    while((k = fscanf(fp, "%s", p2 + pos)) != EOF){
        // update pos
        pos += k;
        p2++;
    }//while loop 2
    

    这将允许将整个文件存储在您的字符串中 前提是它少于 1000 个字符! 否则只需在 while 循环中添加保护措施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      相关资源
      最近更新 更多