我正在编写一个带有一行输入的程序,并解析输入行,如命令行参数,将由常规命令行程序解析。我使用一个名为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 []的正确方法是什么?如果这是我的计划的其他内容,请说明,我确定互联网想听。
答案 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 []'数组中每个字符串的开头,而不是先将它复制到一个单独的数组?),等等。
希望这有助于您走上正确的轨道.....