【问题标题】:What does char* exactly define? If it define a string array, how do I output a single element?char* 究竟定义了什么?如果它定义了一个字符串数组,我如何输出单个元素?
【发布时间】:2012-11-10 19:14:14
【问题描述】:
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的某个元素,但显然printf不起作用。此外, char *string1[20] 究竟定义了什么?它与指针有关吗?谢谢!

【问题讨论】:

  • 不是什么,它与指针有关。

标签: c arrays string pointers output


【解决方案1】:
char *string1[20]

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

由于string1[3] 是通过fgets 填充的(如果有的话),它包含一个以0 结尾的字符串,因此您可以使用

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

如果你想打印单个字符,你会使用

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

例如。

【讨论】:

  • 而 20 表示 20 个指向 char 的指针?但是 string1 可以存储长度超过 20 的字符串,对吧?我曾经编辑过input1.txt,输入了一个很长的字符串,代码依然能正确读取,为什么?
  • 究竟是什么不起作用?当然你不能打印出string1[i],如果fgets没有用0结尾的字符串填充(并且之前分配了足够的内存)。
  • 两者 printf("%s\n", string1[3]);和 printf("%c\n", string1[3][4]);使程序中断... string1 已通过 fgets 填充
  • string1 可以保存 20 个指向 char 的指针。它们中的每一个都可以是指向单个char 的指针,或者更常见的是指向用作chars 数组的内存块的指针。在分配了string1[a] = malloc(BUFSIZE); 之后,检查malloc 是否返回NULL,如果没有,string1[a] 现在包含一个指向足够大的内存块的指针,以容纳BUFSIZE chars,例如一个以0 结尾的字符串长度最多为BUFSIZE-1(不包括 0 终止符)。如果您随后调用fgets(string1[a], BUFSIZE, fp1);,并且不返回NULL,则内存块将包含一个C 字符串。
  • @phil 你不应该 - 并且在发布的代码中不要 - 通过fgets 填写string1,而是string1[3](好吧,string1[i] 用于0 <= i < kk <= 20) .如果你填写了三个以上的字符串(string1[3] 是数组中的第四个),打印 string1[3] 应该可以工作。如果小于,string1[3] 要么未分配(然后尝试打印它是错误的),要么没有填充以 0 结尾的字符串(然后尝试打印它是错误的)。
【解决方案2】:
char* string1[20];

定义了一个指向char 数组的指针,这不是你想要的。你想要一个char 数组。

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

char string1[20];

它应该可以工作。

编辑:Daniel Fisher 是对的……它是一个指向 char 的指针数组。
不过,目前尚不清楚您尝试做什么。
如果你只想将文件读入一个数组,你可以这样做:

int BUFSIZE = 1000;
char string[BUFSIZE];
FILE *fp1 = fopen("input1.txt", "r");
if ( fp1 == 0 )
{
    fprintf(stderr, "Error while opening");
    return 0;
}
fgets(string1, BUFSIZE, fp1);
printf("%s", string1); // print the whole file content
printf("%c", string1[3]); // print the fourth character

【讨论】:

  • 你说得对,实际上我只需要将只包含一个字符串的文件读入一个数组即可。数组的每个元素都应该表示一个字符,而不是字符串。所以我发布的代码不合适。我试过你的代码,但没有结果......它直接退出了
【解决方案3】:

char* 定义了一个指向字符的指针。

char string[20] 定义了一个包含 20 个字符的数组。

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

如果你有一个 char 数组,并且你想将它用作一个以 null 结尾的字符串,你需要像这样获取第一个元素的地址:

char array[20];
char* pointer = &array[0];

所以在你的情况下,char* string[20] 是一个 char 指针数组。

【讨论】:

    【解决方案4】:

    它与指针有关。

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

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

    应该这样做

    【讨论】:

    • 尝试 *string1[20] ,它可能会崩溃,因为数组有 20 个元素,而您正在取消引用第 21 个元素。
    • 还是不对,你现在取的是第20个字符指针的地址。
    • 没用...我读取了一个长度为 7 的字符串, printf("%c", &string1[19]) 给了我一个毫无意义的值,然后我尝试了 printf("%c" , &string1[3]),但得到一个空白。
    • @phil ,当您阅读长度为 7 的字符串时,您不应期望在第 20 位有有意义的值。
    【解决方案5】:

    char *string[20]; 是一个指向“char”的指针数组,它可以用来将字母存储为一个“字符串”数组。我写了“字符串”,因为 C 没有字符串数据类型,例如,与 C++ 不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2019-12-22
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多