【问题标题】:Convert string to array of strings in C [duplicate]将字符串转换为C中的字符串数组[重复]
【发布时间】:2015-10-12 18:00:55
【问题描述】:

所以我有一个名为 c 的字符串。我正在使用以下文件从文件中读取它:

fscanf(file, "%[^/0]", &c);

我有另一个变量声明为 char* array[41]。我需要这是一个由 c 的单个单词/字符串组成的数组。

问题是我不知道 c 中有多少个单独的单词/字符串,因为我是从文件中获取它作为一整行。我的想法是逐个字符地将它放入数组中,如果它是空格,我可以用空字符替换它,但我 95% 确定这根本不起作用。我的另一个想法是,如果我能以某种方式知道一行中有多少个字符串并将每个字符串捕获为一个字符串放入数组中,但是我担心它会与该行之后的内容混淆,因为我不确定有多少有字符串。

【问题讨论】:

  • 别说抽象了。写代码。 显示您的代码。询问具体问题。
  • 您可以使用strtok()。处理它就足够了。但是访问和你描述的不一样。

标签: c arrays string


【解决方案1】:

这正是strtok(3) 所做的。您需要做的就是分配一个“数组”,例如

size_t num = 16;
char **arr = malloc(num * sizeof(char *));

然后用strtok() 的结果填充它并计数...如果达到num,请执行类似的操作

if (count == num)
{
    num *= 2;
    arr = realloc(arr, num * sizeof(char *));
}

malloc()realloc() 添加错误检查。

【讨论】:

  • 16 是从哪里来的?为什么会有指数增长?
  • @EdHeal 设为 1,也可以。这是一个假设,没有别的。
  • @EdHeal 和关于您的编辑,这是一个常见的习惯用法,大大减少了对大量输入的 realloc() 调用。
  • 指数增长呢?
  • @EdHeal 一般来说,分配一个适合 >50% 的预期输入的量,如果结果很少,则加倍。这只是一种常见的策略。
【解决方案2】:

如果您担心字符串的长度,请相应地重新分配一些动态分配的数组的大小。您可以将单个单词存储在另一个数组中。检查一下:

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

int GetWords(const char *String,char buffer[][255]);

int main(void)
{
    char buffer[30][255];

    const char *sentence = "Hello how are you";

    int num_of_words = GetWords(sentence,buffer);

    for( int n = 0 ; n < num_of_words ; n++ )
    {
        printf("word %d : %s\n" , n+1 , buffer[n]);
        //or do something else
    }

    return 0;
}

int GetWords(const char *String,char buffer[][255])
{
    int x = -1 , y = 0 , z = 0 ;

     size_t len = strlen(String) , n = 0 ;

    for( n = 0 ; n < len ; n++ )
    {
        y++;

        if( String[n] == ' ' /* || String[n] == ',' */ )
        {
            y = 0;
            z = 0;
        }

        if( y == 1 ) x++;

        if( y > 0 )
        {
            buffer[x][z] = String[n];
            z++;
            buffer[x][z] = '\0';
        }
    }

    //return number of words
    return (x+1);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2014-07-05
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    相关资源
    最近更新 更多