我正在从事一个涉及从文本文件读取和/或写入的项目。目前,我尝试从文本文件中提取的唯一数据是名称。我的目标是能够在字符指针数组中存储特定名称,这样Char[n]
将为数组中的任何给定n分配一个名称。
我似乎遇到的问题是,我将字符指针元素设置为另一个字符数组,用于存储来自文本文件的读取值。
例如,如果我从文本文件中读取一个名称,并将Name[]
设置为与该名称相同,然后再设置Char[0] = Name
,则Char[0]
将始终在Name
执行时更改
例如,我曾尝试将字符串直接写入Char[0]
,但是随后,在尝试读取和存储值之后,我的程序崩溃了。因此,我采用了这种复杂的方法,即为我扫描的名称分配一个单独的字符数组,并为其设置一个元素。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
FILE * inf = fopen("UserNames.txt", "r");
char User[125];
int err, TopNameNumber = 10;
char *UserNames[TopNameNumber];
if (inf == NULL)
{
printf("ERROR: No name file detected.");
return 0;
}
for(int i = 0; i < TopNameNumber i++)
{
//This reads from my .txt file
err = fscanf(inf, " %s", User);
if(err == EOF)
break;
//This shows me what user was read from the text file
printf("User read %d: %s\n", i+1, User);
//Program assigns the pointer address of User to Names[i]
//This is where I'm having trouble
UserNames[i] = User;
}
for(int c = 0; c < 3; c++)
{
// This always just prints out the last name read from the .txt file
for every name
printf("Name #%d: %s\n", c, UserNames[c]);
}
return 0;
}
我已经参加了几天,我发现了一些有趣的途径可以解决我的问题,例如使用strcpy()
函数复制字符串,或者将User
强制转换为的东西。到目前为止,一切都无济于事。
如果您认为最佳解决方案在这里并不明显,那么我将提供任何建议。我想避免一个字一个字地做所有事情,但是从长远来看,我想我愿意。
我为一个不清楚的问题表示歉意,这是我第一次问这个问题,我只是想提供尽可能多的背景信息:)
到目前为止,我的代码编译时没有警告或错误。
答案 0 :(得分:4)
我看到的公然错误在这里:
SELECT difference(last(value)) FROM E_real_con WHERE time >= now() - 7d GROUP BY time(1d) fill(null)
为 all 用户名重复使用相同的缓冲区不会成功。另一方面,由于未分配内存,因此无法使用ERR: unsupported difference iterator type: *query.stringInterruptIterator
。您可以使用 //Program assigns the pointer address of User to Names[i]
//This is where I'm having trouble
UserNames[i] = User;
来分配和复制字符串。
strcpy
或对于纯粹主义者(因为严格来说strdup
不在标准范围内):
UserNames[i] = strdup(User);
作为安全说明,由于缓冲区的长度为125个字节,因此我建议将其可接受的输入限制为124 + nul-termination:
strdup
当然,当不再使用这些字符串时,您需要对其进行分配,否则,如果您的程序不退出或者是更大代码的一部分,则会导致内存泄漏。
UserNames[i] = malloc(strlen(User)+1);
strcpy(UserNames[i],User);
答案 1 :(得分:0)
您需要为从文件中读取的每个名称分配一个单独的root
内存。
例如:
char[]
或者:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main() {
FILE *inf = fopen("UserNames.txt", "r");
if (inf == NULL) {
printf("ERROR: No name file detected.");
return 0;
}
int err, c = 0;
const int TopNameNumber = 10;
char UserNames[TopNameNumber][125];
for(int i = 0; i < TopNameNumber; i++) {
err = fscanf(inf, " %124s", UserNames[c]);
if (err == EOF)
break;
printf("User read %d: %s\n", c+1, UserNames[c]);
++c;
}
fclose(inf);
for(int i = 0; i < c; i++) {
printf("Name #%d: %s\n", i, UserNames[i]);
}
return 0;
}