【问题标题】:Storing the buffer of fgets in Array将 fgets 的缓冲区存储在 Array 中
【发布时间】:2014-05-02 12:11:27
【问题描述】:

我是 C 的新手(来自 Java),这自然会带来一些困难。我只想编写一个简短的程序,从标准输入读取字符数组并将各个字符串存储在一个数组中。读完字符串后,我只想将它们打印出来,但这对我来说真的很困惑。 这是我的代码:

#include <stdlib.h>
#include <stdio.h>


int main(){

char **stringarray[2];
char buffer[5];
int i = 0;
while( i < 2 && fgets(buffer, 5, stdin) != NULL){
    char *tmp = buffer;
    stringarray[i] = &tmp;
    i++;
}

for(int i = 0; i < 2; i++){
    printf("%s\n", &stringarray[i]);

}

return 0;
}

第一部分实际上是编译的(即打印输出之前的部分)。我知道我的 stringArray 必须是一个 char 指针数组,因为这就是 c 中的 char 数组。它是指向第一个字符的指针。一开始我只是写了

while( i < 2 && fgets(buffer, 5, stdin) != NULL){
    stringarray[i] = buffer;
    i++;
}

它也已编译,但当然我有一个指向缓冲区的指针,它只会保存已读取的最后一个字符串。 我需要做什么才能存储一个简单的字符串数组?

【问题讨论】:

  • 您不需要array of pointers to pointers。一个指针数组就足够了。
  • 在您的printf("%s\n", &amp;stringarray[i]) 中,您正在获取第 i 个元素的 地址(&-运算符)。这肯定不是你想要的。
  • 好的,我又改了一次,但我仍然有一个问题,我不知道在循环的一次迭代期间如何永久存储缓冲区指向的内容。
  • 地址操作员是偶然出现的。很抱歉造成额外的混乱

标签: c string fgets


【解决方案1】:

我建议你改变你的代码如下。

#include <stdlib.h>
#include <stdio.h>
#include <string.h> /* to use strdup function */


int main(){

char *stringarray[2]; /* I don't understand why you use pointer to pointer than pointer, char **stringarray[2]; */
char buffer[6]; /* I suggest 6 than 5, because string has terminate byte in C */
int i = 0;
while( i < 2 && fgets(buffer, 5, stdin) != NULL){
    stringarray[i] = strndup(buffer, 5);
    i++;
}

for(int i = 0; i < 2; i++){
    printf("%s\n", stringarray[i]); /* changed stringarray */

}

return 0;
}

【讨论】:

  • 如果我没记错的话,strndup 不是标准的。它复制字符串(分配内存并将原始字符串复制到其中),在java中你不必考虑内存,但在Cstringarray[i] = buffer只是address赋值,这意味着stringarray的所有元素都会在循环结束时指向同一个缓冲区
【解决方案2】:

char **stringarray[2]; 类似于char ***stringarray,因为数组就像指向数组第一个值的指针。

printf 想要一个char*&amp;stringarray[i] 是一个char**

如果一个字符串是一个数组,那么一个字符串数组就是一个数组数组

所以代码是:

 int main()
{
    char stringarray[2][5];//array of (array of char)
    char buffer[5];
    int i = 0;
    while( i < 2 && fgets(buffer, 5, stdin) != NULL)
    {
        strcpy(stringarray[i],buffer); //copies the buffer into the string array
        i++;
    }

    for(i = 0; i < 2; i++)
    {
        printf("%s\n", stringarray[i]);

    }
    return 0;
}

如果你不想使用buffer,你可以写:

    while( i < 2 && fgets(stringarray[i], 5, stdin) != NULL)
    {
        i++;
    }

请注意,您将获得 5 个字符,最后一个将是 NUL 终止符 \0。因为你必须按回车来验证,\0 之前的那个将是换行\n。而且您将只有 3 个您真正想要的角色。

【讨论】:

  • 绝对不,不要删除。但是arrays are not pointers
  • 我无法访问您的链接:(。我一直认为数组分配了许多变量并保留了指向第一个变量的指针。我会做一些研究,谢谢。
【解决方案3】:

您可以使用如下动态分配技术来做到这一点。

#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
int main()
{
   int num;
   int len=0;
   int i;
   printf("Enter the number of elements to be entered ");
   scanf("%d",&num);

   //Allocate memory for the array of strings 
   char **var=(char **)malloc(num * sizeof(char *));

   for(i=0;i<num;i++)
   {
      printf("Enter the string   : ");
      //get strings using getline 
      getline(&var[i],&len,stdin); 

   }
    for(i=0;i<num;i++)
   {
      printf("String %d   : %s \n",i,var[i]);


   }

    free(var);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多