char*到底定义了什么?如果它定义了一个字符串数组,如何输出单个元素?

char*到底定义了什么?如果它定义了一个字符串数组,如何输出单个元素?,c,arrays,string,pointers,output,C,Arrays,String,Pointers,Output,您好,我得到了上面的代码,它从文本文件中读取字符串并将其存储在数组中。现在我想输出数组string1的某个元素,但显然printf不起作用。此外,char*string1[20]到底定义了什么?这和指针有关吗?谢谢大家! int main() { int a = 0; int BUFSIZE = 1000; char *string1[20]; FILE *fp1 = fopen("input1.txt", "r"); if (fp1 == 0) { fprintf(stderr, "E

您好,我得到了上面的代码,它从文本文件中读取字符串并将其存储在数组中。现在我想输出数组string1的某个元素,但显然printf不起作用。此外,char*string1[20]到底定义了什么?这和指针有关吗?谢谢大家!

int main()
{
int a = 0;
int BUFSIZE = 1000;
char *string1[20];
FILE *fp1 = fopen("input1.txt", "r");
if (fp1 == 0)
{
    fprintf(stderr, "Error while opening");
    return 0;
}
string1[a] = (char *)malloc(BUFSIZE);
while (fgets(string1[a], BUFSIZE, fp1)!=NULL)
{
    a++;
    string1[a] = (char *)malloc(BUFSIZE);
} 
printf("%c", string1[3]);
}
定义指向字符数组的指针,这不是您想要的。您需要一个字符数组

如果像这样删除string1声明中的*

char* string1[20];
它应该会起作用

编辑:丹尼尔·费舍尔是对的……这是指向char的指针数组。 然而,不清楚您试图做什么。 如果只想将文件读入单个数组,可以执行以下操作:

char string1[20];
定义指向字符数组的指针,这不是您想要的。您需要一个字符数组

如果像这样删除string1声明中的*

char* string1[20];
它应该会起作用

编辑:丹尼尔·费舍尔是对的……这是指向char的指针数组。 然而,不清楚您试图做什么。 如果只想将文件读入单个数组,可以执行以下操作:

char string1[20];
声明一个名为string1的数组,该数组包含20个指向char的指针。因此,string1[3]是指向字符的指针,而不是%c格式所需的字符

因为string1[3]是通过fgets填充的,所以它包含一个以0结尾的字符串,所以您可以使用

char *string1[20]
如果要打印单个字符,可以使用

printf("%s\n", string1[3]);
比如说

声明一个名为string1的数组,该数组包含20个指向char的指针。因此,string1[3]是指向字符的指针,而不是%c格式所需的字符

因为string1[3]是通过fgets填充的,所以它包含一个以0结尾的字符串,所以您可以使用

char *string1[20]
如果要打印单个字符,可以使用

printf("%s\n", string1[3]);

例如。

它与指针有关

要打印string1的值,请使用opperator处的值* 基本上,string1实际上并不包含它指向数据的任何内容。所以你不想要string1[20]的值,你想要它的值

printf("%c\n", string1[3][4]);

应该做

它与指针有关

要打印string1的值,请使用opperator处的值* 基本上,string1实际上并不包含它指向数据的任何内容。所以你不想要string1[20]的值,你想要它的值

printf("%c\n", string1[3][4]);
Should do

char*定义指向char的指针

字符字符串[20]定义了一个由20个字符组成的数组

char*string[5]定义一个5 char*的数组或指向char的指针

例如,如果您有一个char数组,并且希望将其用作以null结尾的字符串,则需要采用第一个元素的地址,如下所示:

 printf("%c", *string1[19]);
在您的例子中,char*string[20]是一个char指针数组。

char*定义了一个指向char的指针

字符字符串[20]定义了一个由20个字符组成的数组

char*string[5]定义一个5 char*的数组或指向char的指针

例如,如果您有一个char数组,并且希望将其用作以null结尾的字符串,则需要采用第一个元素的地址,如下所示:

 printf("%c", *string1[19]);

在您的例子中,char*string[20]是一个char指针数组。

char*string[20];是指向char的指针数组,可用于将字母存储为字符串数组。我写了字符串,因为C没有字符串数据类型,例如C++。

< P> char *字符串[20 ];是指向char的指针数组,可用于将字母存储为字符串数组。我写了字符串,因为C没有字符串数据类型,例如C++,它不是任何东西,它和指针有任何关系。不是什么,它和指针有任何关系。相反,尝试*String 1(20),它可能会崩溃,因为数组是20个元素,而你在引用第二十一个元素。您正在获取第20个字符指针的地址。不起作用…我读取了一个长度为7的字符串,printf%c和string1[19]给了我一个无意义的值,然后我尝试printf%c和string1[3],但得到了一个空值。@phil,当您读取长度为7的字符串时,您不应该期望在第20位有意义的值。相反,try*string1[20]可能会崩溃,因为数组为20个元素,而您正在解引用第21个元素。它仍然不正确,到目前为止,您正在获取第20个字符指针的地址。不起作用…我读取了一个长度为7的字符串,printf%c,&string1[19]给了我一个无意义的值,然后我尝试printf%c,&string1[3],但是得到了一个空白。@phil,当您读取长度为7的字符串时,您不应该期望在第20位有一个有意义的值。and 20表示指向char的20个指针?但是string1可以存储长度超过20的字符串,对吗?我曾经编辑过input1.txt,输入了一个很长的字符串,代码仍然可以正确地读取它,为什么?到底是什么不起作用?当然,如果string1[i]没有用以0结尾的字符串b填充,则不能打印它
y fgets和之前已分配足够的内存。都是printf%s\n,string1[3];和printf%c\n,string1[3][4];使程序中断…string1通过fgetsstring1填充,可以容纳20个指向char的指针。它们中的每一个都可以是指向单个字符的指针,或者更常见的是,指向用作字符数组的内存块的指针。分配string1[a]=mallocBUFSIZE;,之后;,检查malloc是否返回NULL,如果不是,string1[a]现在包含一个指向足够大以容纳BUFSIZE字符的内存块的指针,例如一个长度最多为BUFSIZE-1的以0结尾的字符串,不计算0结尾符。如果然后调用fgetsstring1[a],BUFSIZE,fp1;,这不会返回NULL,内存块会包含一个C字符串。@phil您不应该——在发布的代码中也不应该——通过fgets填充string1,但是string1[3]那么,string1[i]对于0和20意味着20个指向char的指针?但是string1可以存储长度超过20的字符串,对吗?我曾经编辑过input1.txt,输入了一个很长的字符串,代码仍然可以正确地读取它,为什么?到底是什么不起作用?当然,如果fgets没有用以0结尾的字符串填充string1[i]并且之前没有分配足够的内存,则不能打印它。printf%s\n,string1[3];和printf%c\n,string1[3][4];使程序中断…string1通过fgetsstring1填充,可以容纳20个指向char的指针。它们中的每一个都可以是指向单个字符的指针,或者更常见的是,指向用作字符数组的内存块的指针。分配string1[a]=mallocBUFSIZE;,之后;,检查malloc是否返回NULL,如果不是,string1[a]现在包含一个指向足够大以容纳BUFSIZE字符的内存块的指针,例如一个长度最多为BUFSIZE-1的以0结尾的字符串,不计算0结尾符。如果然后调用fgetsstring1[a],BUFSIZE,fp1;,这不会返回NULL,内存块中会包含一个C字符串。@phil您不应该——在发布的代码中也不应该——通过fgets填充string1,但是string1[3]好吧,string1[i]对于0您是对的,实际上我只需要将只包含一个字符串的文件读入一个数组中。数组的每个元素都应该表示一个字符,而不是字符串。所以我发布的代码不合适。我尝试了你的代码,但没有结果…它只是直接退出了。你是对的,实际上我只需要将只包含一个字符串的文件读入一个数组。数组的每个元素都应该表示一个字符,而不是字符串。所以我发布的代码不合适。我尝试了你的代码,但没有结果…它只是直接退出