【问题标题】:How to separate an array and store it in a new array?如何分离一个数组并将其存储在一个新数组中?
【发布时间】:2013-12-19 08:24:39
【问题描述】:

我想要做的是:用户输入一个带逗号的字符串;例如:123456,44,55,,66

我想将它分开并存储在一个不带逗号的新数组中;例如:

m[0][]={123456}, m[1][]={44}, m[2][]={55}, m[3][]={}, m[4][]={66}

123456 是学生 ID 号,44 是第一模块的标记,55 是第二模块的标记,NULL 表示学生没有参加第三模块,@987654328 @ 是第 4 个模块的标记。

我该怎么做呢?我所知道的是,通过检测双逗号,这意味着学生没有参加第 3 个模块。

这是我目前所写的:

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

void copystring(char m[],char temp[]);

main()
{
    char temp[10000];
    char m[10000][10000];
    gets(temp);
    copystring(m,temp);
    printf("%s\n",m);           
    return 0;
}

void copystring(char m[],char temp[])
{
    int i;
    int j;
    for (j=0;j<(strlen(temp));j++)
    {
        for (i=0;i<(strlen(temp));i++)
        {
            if (temp[i]!=*(",")&&temp[i]!=*(" "))
            {
                m[j][i]=temp[i];
            }   
        }
    }
}

【问题讨论】:

  • 未定义您对copystring(char **, char *) 的调用。
  • 你卡在哪里了?您缺少什么 - 请您具体说明一下?
  • 不要使用gets()。
  • Smac89,对不起,我真的不知道如何正确定义它。 NiRR,对不起,我不确定我的代码是否有问题,我不知道如何纠正它。你能帮我检查一下吗?
  • moeCake,我应该用什么?

标签: c arrays string strcpy


【解决方案1】:

我已经编辑了我的代码,以便您了解如何声明一个包含二维数组作为参数的函数原型。也使用 fgets() 而不是 gets()。该函数返回读取的标记数,即整数。我认为这可能会有所帮助。运行代码并查看手册页或 google 以更好地理解 fgets()。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define SIZE 1000
int stringcopy(char m[][SIZE],char temp[]);
main()
{
        char temp[SIZE],m[100][SIZE];
        fgets(temp,SIZE,stdin);
        int num=stringcopy(m,temp);
        int i;
        for(i=0;i<num;++i)
                printf("%s\n",m[i]);
        return 0;
}
int stringcopy(char m[][SIZE],char temp[]) {
        int len=strlen(temp);
        int i,j=0,k=0;
        for(i=0;i<len;++i) {
                if(temp[i]!=',')
                        m[j][k++]=temp[i];
                else {
                        m[j][k]='\0';
                        ++j;
                        k=0;
                }
        }
        m[j][k-1]='\0';
        return j+1;
}

【讨论】:

  • 它没有用。 =( 我想让它像 m[0][]={123456},m[1][]={44},m[2][]={55},m[3][]={} ,m[4][]={66}.
  • 我运行了上面的代码,得到了以下输出: 123456 44 55 66 这意味着 m[0] ={123456} , m[1]={44} , m[2] = {55 } 和 m[3]= {} 和 m[4] = {66} 。你的问题还不够吗??
  • 我收到了这个警告:算术指针指向不完整的类型 m[j][k++]=temp[i]
  • 实际上在您的 main 函数中,您正在将 m (一个 2d 数组)传递给 copystring (它需要 1d 数组),因为您定义了错误的原型。只需复制并粘贴我的整个程序并运行它。然后你就会明白你代码中的问题了。
  • 你能教我如何正确定义原型吗?我运行你的程序,最后一个for循环只打印出m[0],如果一个一个打印出来,它就可以了。 printf("%s\n",m[0]); printf("%s\n",m[1]);等等……
【解决方案2】:

你必须通过不同的步骤来解决你的问题,

第一步是检查输入字符串中有多少令牌,以便能够分配足够的空间来存储令牌数组。

然后,您应该在令牌字符串数组中提取输入字符串的令牌。要从输入字符串中提取标记,您可以使用 &lt;string.h&gt; 中的 strtok 函数。

最后,您可以随心所欲地使用您的令牌,例如在您的情况下将它们转换为 long。

编辑:鉴于要求,这是您可以做的一个小实现。我不检查 malloc 的返回,你也许应该这样做。

int main(int argc, char** argv) {
    int i;

    char* input_string = /* your input string for somewhere */;

    char** tokens;
    int tokens_count = 0;
    char* input_ptr = input_string;

    char* tmp_token;
    size_t tmp_token_length;

    // count the occurences of your separtor to have the number of elements
    for(; input_ptr[tokens_count]; input_ptr[tokens_count] == ',' ? tokens_count++ : input_ptr++);

    if(tokens_count == 0) {
        // no tokens found, what do you want to do here ?
    }
    else {
        // build our tokens array
        tokens = malloc(sizeof(*tokens) * tokens_count);
        i = 0;

        tmp_token = strtok(input_string, ',');
        while(tmp_token != NULL) {
            tmp_token_length = strlen(tmp_token);

            if(tmp_token_length != 0) {
                tokens[i] = malloc(tmp_token_length);
                strcpy(tokens[i], tmp_token);
            }
            else {
                tokens[i] = NULL;
            }

            i++;
            tmp_token = strtok(input_string, ',');
        }

        // populate your array of arrays of integers
        long** m = malloc(sizeof(long*) * tokens_count);

        for(i=0; i<tokens_count; i++) {
            char* tmp_token = tokens[i];

            if(tmp_token == NULL) {
                m[i] = NULL;
            }
            else {
                m[i] = malloc(sizeof(long));
                m[i][0] = strtol(tmp_token, NULL, 10);
            }
        }
    }
}

但是,您可能应该通过使用结构而不是大量数组来更改数据结构。

【讨论】:

  • 嗯,我想你想说“转换”,“转换”字符串到整数是不可能的。 ;-)
  • 是的,这些函数将字符串转换为整数,转换是用于表示使用 cast 运算符完成的数据类型更改的术语。
  • 这很挑剔,但它确实在转换。
【解决方案3】:

尝试使用scanf 获取输入,您的copystring 函数似乎没问题;但如果有问题,请调试它以查看问题所在。

【讨论】:

  • 在函数的开头放置一个断点,然后在调试模式下运行。你使用哪个编译器?
【解决方案4】:
for (j=0;j<(strlen(temp));j++)
{
    for (i=0;i<(strlen(temp));i++)
    {
        if (temp[i]!=(',')&&temp[i]!=(' '))
        {
            m[j][i]=temp[i];
        }   
        else{
            m[j][i]='\0';break;// must end a string with null character.
        }
    }
}

用于打印

printf("%s",m[0]);// make a loop for it

【讨论】:

    【解决方案5】:

    您可以使用fgets 或scanf 读取整个字符串,然后使用strtok(string, ",") 获取逗号之间的子字符串。

    检测学生是否遗漏了一些条目,有很多方法,其中很少有:

    1) 检查号码。在strtok 返回NULL 之前获得的子字符串数。
    2)您可以在输入字符串中使用strstr搜索子字符串,,。

    【讨论】:

    • 致投反对票的用户:我在答案中添加了更多内容,请查看。
    • 你能告诉我整个代码吗?谢谢。我真的不明白如何使用 strtok 和 strstr
    • 没那么难,参考strtok,这里也可以找到strstr的帮助。除非您知道它们的用途,否则给您完整的代码将无济于事。
    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 2021-06-14
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多