【问题标题】:C - Mixed Text File Data > To Different Arrays (Int and String)C - 混合文本文件数据 > 到不同的数组(Int 和 String)
【发布时间】:2019-04-16 21:11:09
【问题描述】:

我只有一个包含这些数据的普通“project.txt”文件:

Programming 10 3 4 5 4 3 2 4 5 2 3
Mathematics 8 3 3 4 5 3 2 2 3
Physics 6 3 4 5 3 4 5
Design 6 5 4 5 3 2 4
Logistics 8 3 4 5 3 1 1 2 3

需要打开这个文件,读取所有这些数据并将其写入数组。 我需要以某种方式将字符串和整数分开。 * 现在不需要,但稍后我需要将文本和数字写入不同的文件。 ***现在不需要这样做*

只需要使用 2 个不同的 int 和 char 数组,但我坐了几个小时,找不到关于如何将此字符串与其他内容分开的正常解释。

这是我的代码,有人可以帮我吗?

#include <stdio.h>
#include <stdlib.h>

int main(void) {
FILE *fp;
fp = fopen("C:\\Project\\project.txt", "r");
char arrayWords[140];
int i;

if(fp == NULL){
    printf("Can't Read The File!");
    exit(0);
}

for (i = 0; i < 140; i++){
    fscanf(fp, "%s,", &arrayWords[i]);
}

for (i = 0; i < 140; i++){
    printf("Number is: %s\n\n", &arrayWords[i]);
}


fclose(fp);
return 0;

}

这是我得到的输出,真的很混乱(部分)...

Number is: P13454324523M833453223P6345345D6545324L834531123

Number is: 13454324523M833453223P6345345D6545324L834531123

Number is: 3454324523M833453223P6345345D6545324L834531123

Number is: 454324523M833453223P6345345D6545324L834531123

Number is: 54324523M833453223P6345345D6545324L834531123

Number is: 4324523M833453223P6345345D6545324L834531123

Number is: 324523M833453223P6345345D6545324L834531123

Number is: 24523M833453223P6345345D6545324L834531123

Number is: 4523M833453223P6345345D6545324L834531123

Number is: 523M833453223P6345345D6545324L834531123

Number is: 23M833453223P6345345D6545324L834531123

Number is: 3M833453223P6345345D6545324L834531123

Number is: M833453223P6345345D6545324L834531123

Number is: 833453223P6345345D6545324L834531123

Number is: 33453223P6345345D6545324L834531123

Number is: 3453223P6345345D6545324L834531123

Number is: 453223P6345345D6545324L834531123

Number is: 53223P6345345D6545324L834531123

Number is: 3223P6345345D6545324L834531123

Number is: 223P6345345D6545324L834531123

Number is: 23P6345345D6545324L834531123

Number is: 3P6345345D6545324L834531123

Number is: P6345345D6545324L834531123

Number is: 6345345D6545324L834531123

Number is: 345345D6545324L834531123

Number is: 45345D6545324L834531123

Number is: 5345D6545324L834531123

Number is: 345D6545324L834531123

Number is: 45D6545324L834531123

Number is: 5D6545324L834531123

认为问题在于指针,但不知道,我是初学者,找不到任何问题。

谢谢大家

【问题讨论】:

  • 您使用%s 扫描,然后存储到字符数组arrayWords 的方式不正确。我建议您阅读 C 字符串处理和 printf()/scanf() 代码。

标签: c arrays string pointers


【解决方案1】:

使用strtol() 函数可以轻松解析这些以空格分隔的数字列表。这是一个很好的解决方案,因为它在刚刚转换的数字之后方便地设置了一个指向空白/非数字的 next 块的指针。如果没有要转换的数字,它只会发回原始指针。因此,代码对此进行测试以了解它何时完成。

编辑:也更新为处理名称。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *number_str = "SomeWords 19 9 6 2 22 1 0 -4";
    char *ptr;
    char *next_number;
    int   numbers[1000];
    int   number_count = 0;
    char  name[100];

    next_number = number_str;

    // Copy off the name
    ptr = strchr(number_str, ' ');
    if (ptr != NULL)
    {
        strncpy(name, number_str, ptr-number_str);  // TODO - check bounds of name[]
        name[ptr-number_str] = '\0';

        // Point to the first number
        next_number = ptr+1;

        printf("Stored name [%s]\n", name);
    }

    // Then parse all the numbers
    do 
    {
        ptr = next_number;
        long num = strtol(ptr, &next_number, 10);
        if (ptr != next_number) // found one
        {
            numbers[number_count] = (int)num;
            printf("Stored %3d into numbers[%d]\n", numbers[number_count], number_count);
            number_count += 1;
        }
    } while(ptr != next_number);

    return 0;
}

输出:

Stored name [SomeWords]
Stored  19 into numbers[0]
Stored   9 into numbers[1]
Stored   6 into numbers[2]
Stored   2 into numbers[3]
Stored  22 into numbers[4]
Stored   1 into numbers[5]
Stored   0 into numbers[6]
Stored  -4 into numbers[7]

【讨论】:

  • 我的 int 没有问题,我的行以字符串开头并以数字继续,我可以使用 char 输出整行,但我不能把第一个字符串放在在一个数组中,然后将这些数字放在同一行并将它们放在另一个数组中,这就是我的问题
  • 使用fgets() 将文件中的一行读入char *buffer
  • 是的,现在我可以以某种方式专注于一行,但仍然存在问题。我仍然有混合字符串,带有字母和数字,它以单词 PROGRAMMING 开头并以几个数字继续,我怎样才能只接受这个编程并将其添加到字符串数组?
猜你喜欢
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多