使用char * array []字符串数组的正确方法是什么?

时间:2016-05-20 19:18:52

标签: c arrays string char

我正在编写一个带有一行输入的程序,并解析输入行,如命令行参数,将由常规命令行程序解析。我使用一个名为char * args []的变量来包含已解析的输入字符串,解析和变量非常像常规命令行程序将使用char * argv []。我正在使用这个程序,发现即使我遍历参数,将每一个添加到char * args [],最终结果是变量char * args []只包含最后一个"参数&#34 ;存储在该数组中。

这是代码......

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

typedef int bool;
#define true 1
#define false 0

int main(int argc, char *argv[])
{
  char input[200];
  printf(">");
  gets(input);
  int i=0;
  int t=0;
  int l=0;
  bool space=false;
  char arr[50];
  char *str;
  char *args[10];
  memset(&arr,0,sizeof(arr));
  memset(&str,0,sizeof(str));
  memset(&args,0,sizeof(args));
  for(i;i<sizeof(input);i++)
  {
    printf("l=%d,t=%d\n",l,t);
    if(input[i]=='\0')
      break;
    if(input[i]==' ')
    {
      if(!space)
      {
        printf("arr : %s...\n",arr);
        str=arr;
        printf("str : %s...\n",str);
        args[l]=str;
        printf("args[%d] : %s...\n",l,args[l]);
        memset(&arr,0,sizeof(arr));
        memset(&str,0,sizeof(str));
        t=0;
        l++;
        space=true;
      }
    }
    else
    {
      arr[t]=input[i];
      space=false;
      t++;
    }
  }
  printf("arr : %s...\n",arr);
  str=arr;
  printf("str : %s...\n",str);
  args[l]=str;
  printf("args[%d] : %s...\n",l,args[l]);

  printf("\n");

  //Shows that all of char *args[] is the last string to be set...
  int j=0;
  for(j;j<=l;j++)
  {
    printf("args[%d] = %s...\n",j,args[j]);
  }
  //hello and goodbye are set and output below like a normal char *args[]
  //array should...
  args[0] = "hello";
  args[1] = "goodbye";
  j=0;
  for(j;j<=l;j++)
  {
    printf("args[%d] = %s...\n",j,args[j]);
  }  
  return 0;
}

以下是一些示例输出......

C:\Users\Auguest\Desktop>basecalc.exe
>asdf hsdf ewrr ewr
l=0,t=0
l=0,t=1
l=0,t=2
l=0,t=3
l=0,t=4
arr : asdf...
str : asdf...
args[0] : asdf...
l=1,t=0
l=1,t=1
l=1,t=2
l=1,t=3
l=1,t=4
arr : hsdf...
str : hsdf...
args[1] : hsdf...
l=2,t=0
l=2,t=1
l=2,t=2
l=2,t=3
l=2,t=4
arr : ewrr...
str : ewrr...
args[2] : ewrr...
l=3,t=0
l=3,t=1
l=3,t=2
l=3,t=3
arr : ewr...
str : ewr...
args[3] : ewr...

args[0] = ewr...
args[1] = ewr...
args[2] = ewr...
args[3] = ewr...
args[0] = hello...
args[1] = goodbye...
args[2] = ewr...
args[3] = ewr...

C:\Users\August\Desktop>

我在Windows XP上使用MinGW gcc 4.9.3 ...

我感觉我没有正确使用char * args []。循环遍历此数组并为每个条目分配值的正确方法是什么?一般来说,使用char * args []的正确方法是什么?如果这是我的计划的其他内容,请说明,我确定互联网想听。

2 个答案:

答案 0 :(得分:0)

我明白了......

在这个区块内......

  if(!space)
  {
    printf("arr : %s...\n",arr);
    str=arr;
    printf("str : %s...\n",str);
    args[l]=str;
    printf("args[%d] : %s...\n",l,args[l]);
    memset(&arr,0,sizeof(arr));
    memset(&str,0,sizeof(str));
    t=0;
    l++;
    space=true;
  }

args []中的每个条目都设置为指针str,因此args []数组中的所有条目都设置为相同的指针str,它指向arr变量的最新状态... < / p>

不应使用char * args [] char args [] []应该使用。注意:编译时需要args [] []二维数组的维度。

char * strcat(char * dest,const char * src);

应该用于将每个args [x]条目设置为arr变量的当前状态。

答案 1 :(得分:0)

问题是你只有一个数组(arr [])来保存你当前处理的字符串的副本 - 当你点击一个空格时,你在args [l]中设置你的下一个指针指向arr []的当前内容。下一次通过你的循环,你用下一个字符串替换arr []的内容,并且因为args [0]直到args [l-1]都指向arr []的单个副本,所以它们都显示结束只复制到arr []的最后一个内容。

有许多更优雅的方式可以做你想要的......但也许你最容易尝试(基于你已经写过的代码)是将'arr []'变成两个-dimensional数组,从你的硬编码常量,你可以使用'arr [10] [50]',当填写arr [] []时,使用'arr [l] [t] = input [i];'。在分配args [l]时,使用'args [l] =&amp;(arr [l] [0]);'。

一旦你开始理解指针,数组等是如何工作的,你就可以开始简化代码,使其更安全(例如避免缓冲区溢出),减少不必要的副本(即你可以设置args [l]直接指向'input []'数组中每个字符串的开头,而不是先将它复制到一个单独的数组?),等等。

希望这有助于您走上正确的轨道.....