如何从 char 数组转换/复制以便我可以将它存储在 char 指针数组中?
How do I cast /copy from a char array so that I may store it in a char pointer array?
我正在从事一个涉及从文本文件读取和/或写入的项目。目前我试图从文本文件中提取的唯一数据是名称。我的目标是能够将特定名称存储在字符指针数组中,这样 Char[n]
将为数组中的任何给定 n 分配一个名称。
我似乎遇到的问题是我将我的字符指针元素设置为另一个字符数组,我在其中存储从文本文件读取的值。
例如,如果我从文本文件中读取一个名称并将 Name[]
设置为该名称然后稍后设置 Char[0] = Name
那么 Char[0]
将始终在 [=15= 时更改] 确实如此。
例如,我曾尝试将字符串直接写入 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
到某事。然而,到目前为止一切都无济于事。
如果解决方案在这里不明显,我将不胜感激任何关于您认为最佳解决方案的建议。我想避免逐字逐句地做所有事情,但我想我愿意在很长一段时间内这样做 运行.
对于一个可能不清楚的问题,我深表歉意,这是我第一次提出这个问题,我只是想尽可能多地提供背景信息:)
我的代码现在编译时没有警告或错误。
我看到的明显错误在这里:
//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);
或纯粹主义者(因为 strdup
不严格符合标准):
UserNames[i] = malloc(strlen(User)+1);
strcpy(UserNames[i],User);
作为安全注意事项,由于缓冲区长 125 字节,我建议将它可以接受的输入限制为 124+nul 终止:
err = fscanf(inf, " %124s", User);
当然,您需要在不再使用时释放字符串,否则如果您的程序没有退出或者是更大代码的一部分,您将遇到内存泄漏。
free(UserNames[i]); // in a loop in the end, when no longer needed
您需要为从文件中读取的每个名称单独分配内存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;
}
或者:
#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;
}
char User[125];
int err, c = 0;
const int TopNameNumber = 10;
char* UserNames[TopNameNumber];
for(int i = 0; i < TopNameNumber; i++) {
err = fscanf(inf, " %124s", User);
if (err == EOF)
break;
printf("User read %d: %s\n", c+1, User);
UserNames[c] = malloc(strlen(User) + 1);
if (UserNames[c] == NULL) {
printf("ERROR: Memory allocation failed.");
break;
}
strcpy(UserNames[c], User);
++c;
}
fclose(inf);
for(int i = 0; i < c; i++) {
printf("Name #%d: %s\n", i, UserNames[i]);
}
for(int i = 0; i < c; i++) {
free(UserNames[i]);
}
return 0;
}
我正在从事一个涉及从文本文件读取和/或写入的项目。目前我试图从文本文件中提取的唯一数据是名称。我的目标是能够将特定名称存储在字符指针数组中,这样 Char[n]
将为数组中的任何给定 n 分配一个名称。
我似乎遇到的问题是我将我的字符指针元素设置为另一个字符数组,我在其中存储从文本文件读取的值。
例如,如果我从文本文件中读取一个名称并将 Name[]
设置为该名称然后稍后设置 Char[0] = Name
那么 Char[0]
将始终在 [=15= 时更改] 确实如此。
例如,我曾尝试将字符串直接写入 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
到某事。然而,到目前为止一切都无济于事。
如果解决方案在这里不明显,我将不胜感激任何关于您认为最佳解决方案的建议。我想避免逐字逐句地做所有事情,但我想我愿意在很长一段时间内这样做 运行.
对于一个可能不清楚的问题,我深表歉意,这是我第一次提出这个问题,我只是想尽可能多地提供背景信息:)
我的代码现在编译时没有警告或错误。
我看到的明显错误在这里:
//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);
或纯粹主义者(因为 strdup
不严格符合标准):
UserNames[i] = malloc(strlen(User)+1);
strcpy(UserNames[i],User);
作为安全注意事项,由于缓冲区长 125 字节,我建议将它可以接受的输入限制为 124+nul 终止:
err = fscanf(inf, " %124s", User);
当然,您需要在不再使用时释放字符串,否则如果您的程序没有退出或者是更大代码的一部分,您将遇到内存泄漏。
free(UserNames[i]); // in a loop in the end, when no longer needed
您需要为从文件中读取的每个名称单独分配内存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;
}
或者:
#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;
}
char User[125];
int err, c = 0;
const int TopNameNumber = 10;
char* UserNames[TopNameNumber];
for(int i = 0; i < TopNameNumber; i++) {
err = fscanf(inf, " %124s", User);
if (err == EOF)
break;
printf("User read %d: %s\n", c+1, User);
UserNames[c] = malloc(strlen(User) + 1);
if (UserNames[c] == NULL) {
printf("ERROR: Memory allocation failed.");
break;
}
strcpy(UserNames[c], User);
++c;
}
fclose(inf);
for(int i = 0; i < c; i++) {
printf("Name #%d: %s\n", i, UserNames[i]);
}
for(int i = 0; i < c; i++) {
free(UserNames[i]);
}
return 0;
}