未定长度字符串 c
string of undetermined length c
您好,我试图在 c 中创建一个长度不确定的字符串数组。
这是我的代码:
int main()
{
int lineCount=linesCount();
char text[lineCount][10];
printf("%d",lineCount);
FILE * fpointer = fopen("test.txt","r");
fgets(text,10,fpointer);
fclose(fpointer);
printf("%s",text);
return 0;
}
我想把 10 换成
char text[lineCount][10];
我的代码读出一个文件我已经使行数动态化。
由于行长度不可预测,我想用动态的东西替换 10。
提前致谢。
为了干净地做到这一点,我们需要一个 char *
数组而不是二维 char
数组:
char *text[lineCount];
而且,我们需要使用堆中的内存来存储各个行。
另外,不要像 10
这样的所谓的“魔法”数字“硬连线”。使用 enum
或 #define
(例如)#define MAXWID 10
。请注意,使用下面的解决方案,我们完全不需要使用幻数。
此外,请注意下面使用 sizeof(buf)
而不是幻数。
而且,我们希望在读取和打印时[单独]循环。
无论如何,这是重构后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
linesCount(void)
{
return 23;
}
int
main(void)
{
int lineCount = linesCount();
char *text[lineCount];
char buf[10000];
printf("%d", lineCount);
// open file and _check_ the return
const char *file = "test.txt";
FILE *fpointer = fopen(file, "r");
if (fpointer == NULL) {
perror(file);
exit(1);
}
int i = 0;
while (fgets(buf, sizeof(buf), fpointer) != NULL) {
// strip newline
buf[strcspn(buf,"\n")] = 0;
// store line -- we must allocate this
text[i++] = strdup(buf);
}
fclose(fpointer);
for (i = 0; i < lineCount; ++i)
printf("%s\n", text[i]);
return 0;
}
更新:
以上代码来源于您的原始代码。但是,它假定 linesCount
函数可以预测行数。而且,它不会检查固定长度 text
数组的溢出。
这是一个更通用的版本,它允许具有不同行长的任意数量的行:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
int lineCount = 0;
char **text = NULL;
char buf[10000];
// open file and _check_ the return
const char *file = "test.txt";
FILE *fpointer = fopen(file, "r");
if (fpointer == NULL) {
perror(file);
exit(1);
}
int i = 0;
while (fgets(buf, sizeof(buf), fpointer) != NULL) {
// strip newline
buf[strcspn(buf,"\n")] = 0;
++lineCount;
// increase number of lines in array
text = realloc(text,sizeof(*text) * lineCount);
if (text == NULL) {
perror("realloc");
exit(1);
}
// store line -- we must allocate this
text[lineCount - 1] = strdup(buf);
}
fclose(fpointer);
// print the lines
for (i = 0; i < lineCount; ++i)
printf("%s\n", text[i]);
// more processing ...
// free the lines
for (i = 0; i < lineCount; ++i)
free(text[i]);
// free the list of lines
free(text);
return 0;
}
您好,我试图在 c 中创建一个长度不确定的字符串数组。 这是我的代码:
int main()
{
int lineCount=linesCount();
char text[lineCount][10];
printf("%d",lineCount);
FILE * fpointer = fopen("test.txt","r");
fgets(text,10,fpointer);
fclose(fpointer);
printf("%s",text);
return 0;
}
我想把 10 换成
char text[lineCount][10];
我的代码读出一个文件我已经使行数动态化。 由于行长度不可预测,我想用动态的东西替换 10。 提前致谢。
为了干净地做到这一点,我们需要一个 char *
数组而不是二维 char
数组:
char *text[lineCount];
而且,我们需要使用堆中的内存来存储各个行。
另外,不要像 10
这样的所谓的“魔法”数字“硬连线”。使用 enum
或 #define
(例如)#define MAXWID 10
。请注意,使用下面的解决方案,我们完全不需要使用幻数。
此外,请注意下面使用 sizeof(buf)
而不是幻数。
而且,我们希望在读取和打印时[单独]循环。
无论如何,这是重构后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
linesCount(void)
{
return 23;
}
int
main(void)
{
int lineCount = linesCount();
char *text[lineCount];
char buf[10000];
printf("%d", lineCount);
// open file and _check_ the return
const char *file = "test.txt";
FILE *fpointer = fopen(file, "r");
if (fpointer == NULL) {
perror(file);
exit(1);
}
int i = 0;
while (fgets(buf, sizeof(buf), fpointer) != NULL) {
// strip newline
buf[strcspn(buf,"\n")] = 0;
// store line -- we must allocate this
text[i++] = strdup(buf);
}
fclose(fpointer);
for (i = 0; i < lineCount; ++i)
printf("%s\n", text[i]);
return 0;
}
更新:
以上代码来源于您的原始代码。但是,它假定 linesCount
函数可以预测行数。而且,它不会检查固定长度 text
数组的溢出。
这是一个更通用的版本,它允许具有不同行长的任意数量的行:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
int lineCount = 0;
char **text = NULL;
char buf[10000];
// open file and _check_ the return
const char *file = "test.txt";
FILE *fpointer = fopen(file, "r");
if (fpointer == NULL) {
perror(file);
exit(1);
}
int i = 0;
while (fgets(buf, sizeof(buf), fpointer) != NULL) {
// strip newline
buf[strcspn(buf,"\n")] = 0;
++lineCount;
// increase number of lines in array
text = realloc(text,sizeof(*text) * lineCount);
if (text == NULL) {
perror("realloc");
exit(1);
}
// store line -- we must allocate this
text[lineCount - 1] = strdup(buf);
}
fclose(fpointer);
// print the lines
for (i = 0; i < lineCount; ++i)
printf("%s\n", text[i]);
// more processing ...
// free the lines
for (i = 0; i < lineCount; ++i)
free(text[i]);
// free the list of lines
free(text);
return 0;
}