c语言中的字符串数组
如何在C中使用字符串数组作为参数?如果我要编写一个带有签名的函数: 我想我没有很好地解释我自己。。。我将发布我正在努力工作的代码c语言中的字符串数组,c,arrays,C,Arrays,如何在C中使用字符串数组作为参数?如果我要编写一个带有签名的函数: 我想我没有很好地解释我自己。。。我将发布我正在努力工作的代码 int format_parameters(char* str) { char local_str[201] = ""; int i = 0; int j = 0; int flip = 0; while(str[i]) { if((str[i] == '"') && (flip == 0)
int format_parameters(char* str) {
char local_str[201] = "";
int i = 0;
int j = 0;
int flip = 0;
while(str[i]) {
if((str[i] == '"') && (flip == 0)) flip = 1;//Sentence allowed
else if((str[i] == '"') && (flip == 1)) flip = 0;//Sentence not allowed
if(flip == 1) append_char(local_str, str[i]);
//check if space
else if(flip == 0) {
int c = str[i];
if(!isspace(c)) append_char(local_str, str[i]);
else {
if((strlen(local_str) > 0) && (j < 4)) {
//local-str copied to param[j] here
//printf("j = %d %s\n",j,local_str);
local_str[0] = '\0';
j++;
}
}
}
i++;
}
//Add \0 to param
return flip;
}//end format_parameters
void append_char(char* str, char c) {
int len = strlen(str);
str[len] = c;
str[len+1] = '\0';
}//end append_char
int main() {
char str[200];
//str filled with stuff...
int x = format_parameters(str);
}
int格式_参数(char*str){
char local_str[201]=“”;
int i=0;
int j=0;
int flip=0;
while(str[i]){
如果((str[i]=''”)&&(flip==0))flip=1;//允许使用句子
else如果((str[i]=''”)&&(flip==1))flip=0;//不允许使用句子
if(flip==1)append_char(local_str,str[i]);
//检查是否有空格
else if(翻转==0){
int c=str[i];
if(!isspace(c))append_char(local_str,str[i]);
否则{
if((strlen(local_str)>0)和&(j<4)){
//本地str复制到此处的param[j]
//printf(“j=%d%s\n”,j,本地\u str);
本地_str[0]='\0';
j++;
}
}
}
i++;
}
//将\0添加到参数
回程翻转;
}//结束格式参数
void append_char(char*str,char c){
int len=strlen(str);
str[len]=c;
str[len+1]='\0';
}//结束附加字符
int main(){
char-str[200];
//装满了东西。。。
int x=格式参数(str);
}
format\u parameters
signature中应该有第二个(和第三个?)参数,一个char*param[5]
,应该可以从main
中读取,这样做有效吗
#include <string.h>
#include <assert.h>
#include <stdio.h>
int format_parameters(char *str, char *param[], size_t nparam)
{
char **next = param;
char **end = param + nparam;
char *data = str;
assert(str != 0 && param != 0 && nparam != 0);
while (next < end && *data != '\0')
{
*next++ = data;
data = strchr(data, ' '); // Choose your own splitting criterion
if (data == 0)
break;
*data++ = '\0';
}
return(next - param);
}
int main(void)
{
char str[] = "a b c d";
char *param[5];
int nvals = format_parameters(str, param, 5);
int i;
for (i = 0; i < nvals; i++)
printf("Param %d: <<%s>>\n", i+1, param[i]);
return 0;
}
#包括
#包括
#包括
int格式参数(char*str,char*param[],size\u t nparam)
{
char**next=param;
char**end=param+nparam;
char*data=str;
断言(str!=0&¶m!=0&&nparam!=0);
while(下一步
返回值是找到的参数数。如果传递空字符串,则为0。注意前导空格、尾随空格和重复空格;代码可以工作,但可能不是您希望的那样。这完全是关于内存分配的 如果在调用函数之前为
param
分配静态内存,则内存将存在于该范围内
否则,看看动态分配,它将一直存在,直到您告诉它离开。正如Jonatahan指出的,您需要更多参数:
int format_parameters(char* strInput, char* paramOutput[], size_t cbMaxParams );
// return value is actual number of parameter strings in paramOutput
paramOutput
是指针数组。因此,调用方必须提供一个指针数组,被调用函数必须为字符串分配内存,并在数组中设置指针:
// main:
#define SIZE 20
char * params[SIZE];
int result = format_parameters( szInput, params, SIZE );
// after use go through params and free all pointers
// function:
int format_parameters(char* strInput, char* paramOutput[], size_t cbMaxParams )
{
// ...
for( size_t i=0; (i<cbMaxParams) && (!noMoreParams); i++ )
{
// ...
paramOutput[i] = (char *)malloc( xxxx );
// ...
}
// ...
}
//main:
#定义尺寸20
字符*参数[大小];
int result=格式参数(szInput、params、SIZE);
//使用后,检查参数并释放所有指针
//功能:
int格式参数(char*strInput,char*paramOutput[],size\u t cbMaxParams)
{
// ...
对于(size_t i=0;(i您必须在函数外部创建char*param[]数组,并将其作为参数传递:
int paramCount = countParameters(str); // you have to create this function
char* param[] = malloc(paramCount * sizeof(char*));
format_parameters(str, param);
在函数内部:
int format_parameters(char* str, char* param[])
{
int currentParamIndex = 0;
..........
//TODO: check if currentParamIndex < paramCount
char* currentParam = str + currentParamStart; // currentParamStart is the start index of the parameter in the str containing all parameters
param[currentParamIndex] = currentParam;
currentParamIndex++;
.............
}
int格式_参数(char*str,char*param[])
{
int currentParamIndex=0;
..........
//TODO:检查currentParamIndex是否
为了编写安全代码,还必须将paramCount作为参数传递,以格式化_参数,这样函数就不会访问数组边界之外的元素
或者您应该使用?您需要知道数组中有多少个插槽作为param
传递;这需要为函数添加一个额外的参数。@schot:如果输入字符串不可修改,它将具有const char*
类型。