从C中的文件读取时数组未正确递增 #包括 #包括 #包括 #定义数组_MAX 100 int main(){ 文件*输入,*输出; 字符*令牌[100]; char-buf[100]; 整数计数=0; 输入=fopen(“/Users/home/Desktop/test.txt”,“r”); 输出=fopen(“/Users/home/Desktop/test2.txt”,“w”); while(fgets(buf,sizeof(buf),input)!=NULL){ 令牌[count]=strtok(buf,“\n”); ++计数; } for(int i=0;i

从C中的文件读取时数组未正确递增 #包括 #包括 #包括 #定义数组_MAX 100 int main(){ 文件*输入,*输出; 字符*令牌[100]; char-buf[100]; 整数计数=0; 输入=fopen(“/Users/home/Desktop/test.txt”,“r”); 输出=fopen(“/Users/home/Desktop/test2.txt”,“w”); while(fgets(buf,sizeof(buf),input)!=NULL){ 令牌[count]=strtok(buf,“\n”); ++计数; } for(int i=0;i,c,arrays,file-io,C,Arrays,File Io,strtok()每次都在相同的buf上运行,因此每次都会返回相同的地址。循环完成后,最后一次读取的值在缓冲区中,因此这就是打印的内容 您要保存以下行的副本: #include<stdio.h> #include<string.h> #include <stdlib.h> #define ARRAY_MAX 100 int main() { FILE *input, *output; char *token[100]; char b

strtok()
每次都在相同的
buf
上运行,因此每次都会返回相同的地址。循环完成后,最后一次读取的值在缓冲区中,因此这就是打印的内容

您要保存以下行的副本:

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

#define ARRAY_MAX 100

int main() {

    FILE *input, *output;
    char *token[100];
    char buf[100];
    int count = 0;
    input = fopen("/Users/home/Desktop/test.txt", "r");
    output = fopen("/Users/home/Desktop/test2.txt", "w");

    while (fgets(buf, sizeof(buf), input) != NULL) {
        token[count] = strtok(buf, "\n");
        ++count;
    }

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

    printf("%d\n\n" ,count);
    return 0 ;

}
strtok()
每次都在相同的
buf
上运行,因此每次都会返回相同的地址。循环完成后,最后一次读取的值在缓冲区中,因此这就是打印的内容

您要保存以下行的副本:

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

#define ARRAY_MAX 100

int main() {

    FILE *input, *output;
    char *token[100];
    char buf[100];
    int count = 0;
    input = fopen("/Users/home/Desktop/test.txt", "r");
    output = fopen("/Users/home/Desktop/test2.txt", "w");

    while (fgets(buf, sizeof(buf), input) != NULL) {
        token[count] = strtok(buf, "\n");
        ++count;
    }

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

    printf("%d\n\n" ,count);
    return 0 ;

}
strtok()
每次都在相同的
buf
上运行,因此每次都会返回相同的地址。循环完成后,最后一次读取的值在缓冲区中,因此这就是打印的内容

您要保存以下行的副本:

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

#define ARRAY_MAX 100

int main() {

    FILE *input, *output;
    char *token[100];
    char buf[100];
    int count = 0;
    input = fopen("/Users/home/Desktop/test.txt", "r");
    output = fopen("/Users/home/Desktop/test2.txt", "w");

    while (fgets(buf, sizeof(buf), input) != NULL) {
        token[count] = strtok(buf, "\n");
        ++count;
    }

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

    printf("%d\n\n" ,count);
    return 0 ;

}
strtok()
每次都在相同的
buf
上运行,因此每次都会返回相同的地址。循环完成后,最后一次读取的值在缓冲区中,因此这就是打印的内容

您要保存以下行的副本:

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

#define ARRAY_MAX 100

int main() {

    FILE *input, *output;
    char *token[100];
    char buf[100];
    int count = 0;
    input = fopen("/Users/home/Desktop/test.txt", "r");
    output = fopen("/Users/home/Desktop/test2.txt", "w");

    while (fgets(buf, sizeof(buf), input) != NULL) {
        token[count] = strtok(buf, "\n");
        ++count;
    }

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

    printf("%d\n\n" ,count);
    return 0 ;

}
任务

while (fgets(buf, sizeof(buf), input) != NULL) {
    token[count] = strdup( strtok(buf, "\n") );
    ++count;
}
只需将缓冲区的地址复制到指针中。然后重新使用相同的缓冲区,并将相同的地址复制到数组的下一个元素中。您需要做的是在读取每一新行时为其分配内存,并将缓冲区的内容复制到新分配的内存中:

token[count] = ...
任务

while (fgets(buf, sizeof(buf), input) != NULL) {
    token[count] = strdup( strtok(buf, "\n") );
    ++count;
}
只需将缓冲区的地址复制到指针中。然后重新使用相同的缓冲区,并将相同的地址复制到数组的下一个元素中。您需要做的是在读取每一新行时为其分配内存,并将缓冲区的内容复制到新分配的内存中:

token[count] = ...
任务

while (fgets(buf, sizeof(buf), input) != NULL) {
    token[count] = strdup( strtok(buf, "\n") );
    ++count;
}
只需将缓冲区的地址复制到指针中。然后重新使用相同的缓冲区,并将相同的地址复制到数组的下一个元素中。您需要做的是在读取每一新行时为其分配内存,并将缓冲区的内容复制到新分配的内存中:

token[count] = ...
任务

while (fgets(buf, sizeof(buf), input) != NULL) {
    token[count] = strdup( strtok(buf, "\n") );
    ++count;
}
只需将缓冲区的地址复制到指针中。然后重新使用相同的缓冲区,并将相同的地址复制到数组的下一个元素中。您需要做的是在读取每一新行时为其分配内存,并将缓冲区的内容复制到新分配的内存中:

token[count] = ...

请发布您的输入。
token[count]=strtok(buf,“\n”);
不复制“字符串”-标记。当输入包含超过100行时会发生什么?这一行:#define ARRAY_MAX 100似乎表示每个数组将包含100个条目,但是所有数组大小都硬编码为100,而不是使用ARRAY_MAX。此外,#define的值应始终用(and)包围为避免将值用作表达式的一部分时出错,请发布您的输入。
token[count]=strtok(buf,“\n”);
不复制“字符串”-标记。当输入包含超过100行时会发生什么?这一行:#define ARRAY_MAX 100似乎表示每个数组将包含100个条目,但是所有数组大小都硬编码为100,而不是使用ARRAY_MAX。此外,#define的值应始终用(and)包围为避免将值用作表达式的一部分时出错,请发布您的输入。
token[count]=strtok(buf,“\n”);
不复制“字符串”-标记。当输入包含超过100行时会发生什么?这一行:#define ARRAY_MAX 100似乎表示每个数组将包含100个条目,但是所有数组大小都硬编码为100,而不是使用ARRAY_MAX。此外,#define的值应始终用(and)包围为避免将值用作表达式的一部分时出错,请发布您的输入。
token[count]=strtok(buf,“\n”);
不复制“字符串”-标记。当输入包含超过100行时会发生什么?这一行:#define ARRAY_MAX 100似乎表示每个数组将包含100个条目,但是所有数组大小都硬编码为100,而不是使用ARRAY_MAX。此外,#define的值应始终用(and)包围将值用作表达式的一部分时避免错误的步骤