Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中的字符串数组_C_Arrays - Fatal编程技术网

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)

如何在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)) 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*
类型。