【问题标题】:How to pass a character string to a function in C如何将字符串传递给C中的函数
【发布时间】:2015-12-27 15:30:24
【问题描述】:

我正在尝试处理字符串以更改文件中的某些内容。我从文件中读取了一个字符串,其中包含一个命令和一个参数,由space 字符分隔。我用标记分隔了这个数组。

现在我想传递第二个标记,它是函数的参数。我的问题是,当我运行我的程序时,屏幕冻结并且没有任何反应。这是我的分离方式和对函数的调用。

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

void create_file(char *argument)
{
    //some code goes here
}

int main()
{
    int i = -1;
    char *token[5];
    char command[20];
    const char delim[1] = " ";
    FILE *fin;

    fin = fopen("mbr.op", "r");

    while(fscanf(fin, "%[^\n]", command) == 1)
    {
        i = -1;
        token[++i] = strtok(command, delim);
        while(token[i] != NULL)
            token[++i] = strtok(NULL, delim);
        if(strcmp(token[0], "CREATE_FILE") == 0)
            create_file(token[1]);
    }
    fclose(fin);
    return 0;
}

【问题讨论】:

  • 你在哪里设置了command的值?
  • 它是从输入文件中读取的,抱歉我忘记添加了,现在修改代码...
  • const char delim[1] = " "; --> const char delim[2] = " ";const char delim[ ] = " ";
  • 使用调试器进入代码并确定机器冻结的确切行
  • 这些行:token[++i] = strtok(command, delim); while(token[i] != NULL) token[++i] = strtok(NULL, delim); 将使token[1] 存在,如果 token[0] 不为 NULL,这有保证吗?如果不能保证,那么作为 create_file 输入的 token[1] 可能会指向任何地方。

标签: c arrays function character


【解决方案1】:

您有一些错误,首先command[20] 是一个未初始化的字符串,这将导致未定义的行为。其次,你没有检查第一个参数和第二个参数,所以我在注释的地方添加了一个测试。另外,字符串不够长,所以我删除了长度。最后,我测试了一个传递给函数的NULL 指针。

编辑代码被添加到问题中以显示command[20] 已初始化,但它仍然太短而无法获取命令和合理的文件名(感谢@ameyCU)。

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

void create_file(char *argument)
{
    if(argument == NULL)
        printf("NULL pointer\n");
    else
        printf("Arg: %s\n", argument);
}

int main(void)
{
    int i = -1;
    char *token[5];
    char command[] =  "CREATE_FILE myfile.txt";
    const char delim[] = " ";

    token[++i] = strtok(command, delim);
    while(token[i] != NULL)
        token[++i] = strtok(NULL, delim);
    if(token[0] != NULL && strcmp(token[0], "CREATE_FILE") == 0)    // added test
        create_file(token[1]); 
    return 0;
}

程序输出

Arg: myfile.txt

【讨论】:

  • command 未初始化,但在将其传递给 strtok 之前,使用 OP 代码中的 while 循环中的 fscanf 从文件读取数据。
  • @ameyCU 在我开始写答案后将代码添加到 Q 中。
  • 首先我以为我将字符串token[1]传递给函数的方式有误,但我终于发现冻结是由我的create_file中的无限循环引起的功能。但是,您的安全测试和所有其他修改肯定是有用的。谢谢!
【解决方案2】:

数组定义中出现第一个错误:

const char delim[1] = " ";

在 C 中,"" 是一个字符串 - 由'\0' 分隔的字符数组。这意味着“=”右侧是一个由两个字符组成的字符串:

// ' ' + '\0'
//0x20  0x00

因此这应该是一个由两个字符组成的数组:

const char delim[2] = " ";

const char delim[] = " ";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2017-04-05
    • 2019-03-18
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多