gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:38:58 25 4
gpt4 key购买 nike

我正在编写一个程序,它接受一行输入,并解析该输入行,就像常规命令行程序解析命令行参数一样。我使用一个名为 char *args[] 的变量来包含已解析的输入字符串、解析和变量,非常类似于常规命令行程序使用 char *argv[] 的情况。我正在使用这个程序,发现即使我循环遍历参数,将每个参数添加到 char *args[] 中,最终结果是变量 char *args[] 只包含要存储在的最后一个“参数”该数组。

这是代码...

#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[] 的正确方法是什么?如果我的程序有其他问题,请说出来,我相信互联网会愿意听到。

最佳答案

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

有很多更优雅的方法可以做你想做的事......但也许你首先尝试的最简单的方法(基于查看你已经编写的代码)是将 'arr[]' 变成两个维数组,从硬编码常量中,您可以使用 'arr[10][50]',并且在填写 arr[][] 时,使用 'arr[l][t] = input[i];'。并且在分配 args[l] 时,使用 'args[l] = &(arr[l][0]);'。

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

希望这可以帮助您走上正确的道路......

关于c - 使用 char *array[] 字符串数组的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37354337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com