【问题标题】:C parsing string to array of chars without any lib functionsC将字符串解析为没有任何lib函数的字符数组
【发布时间】:2016-12-09 16:10:25
【问题描述】:

我正在尝试做的是解析字符串,其中包含字符数组数组的空格。所以如果输入是“ab cd ef”,我希望我的数组是数组[0]==ab,数组[1]==cd,数组[2]==ef。我希望这能说清楚。然而问题是我不能使用任何库函数。没有 string.h,没有 fget,只有 scanf 和 printf。这是我的代码片段:

char word[25] = "";
char *words[25];

for (int i = 0; i <= find_length(input); i++){
    if(input[i] == ' ' || i == find_length(input)){
        words[position] = word;
        printf("%s%d ",words[position], position);
        position++;
        counter = 0;
        word[0] = '\0';
    }
    else{
        word[counter] = input[i];
        counter++;
    }
}

position = 0;

while(counter < 5){
    printf("%s%d ",words[position], position);
    counter++;
}

首先我将字符串解析为单个单词,然后尝试将它们放入数组中。我希望我的逻辑是正确的。所以问题是,第一个 printf(for 循环中的一个)打印正确的值及其位置。但是第二个 printf (仅用于确保正确解析字符串)仅打印 0。 因此,例如输入“ab cd ef”给出:

ab0 cd1 ef2 0 0 0 0 0

我怀疑问题是我没有向数组数组添加值,只是分配指针。而且由于我转储了“单词”,因此它们什么也没有。如果这是正确的,我如何分配值而不是指针?

当然,这个假设可能是错误的,如果是这样,你能指出我的错误以及如何解决它吗?谢谢。

PS:我知道我应该 strcpy 字符串的值 not = it,但正如我所说,我不能使用除 scanf 和 printf 以外的任何 lib 函数(find_length 是我自己的函数)

【问题讨论】:

  • 什么是input?它的类型,它的价值?
  • find_length() 的代码在哪里?
  • 检查您对counteroffset 的使用。它们在最后五行代码中混在一起。
  • 假设你的find_length() 相当于strlen(),我认为可视化你的代码会有所帮助:pastebin.com/mbLJ0ueY。将此 pastebin 中的 url 复制并粘贴到您的浏览器。等待几秒钟让它加载,然后使用前进和后退按钮导航。这不是垃圾邮件...我没有在此处粘贴链接,因为它太大而无法容纳评论,而且缩短的 URL 不受欢迎。
  • words[position] = word;: 你设置了相同的缓冲区地址。然后缓冲区重置为word[0] = '\0';

标签: c arrays string pointers char


【解决方案1】:

我不太同意@harper 的回答,因为主要问题如下,因为 OP 几乎自己想通了:

我怀疑问题是我没有向数组中添加值 数组,只是分配指针。而且由于我转储“单词”,他们指出 一无所有。如果这是正确的,我如何分配值而不是 指针?

此代码将使words[0] 指向与字符数组word 关联的内存块。然后words[1] 将指向同一个块。然后words[3]等等..

最后,char* 数组words[] 中的所有元素都将指向char 数组word[],其中将包含'\0' 作为其第一个元素,看到OP 重复执行word[0] = '\0';

所以我提出的解决方法,除了已经提到的关于 while 循环的内容之外,是为每个子字符串分配内存,然后使用简单的 for 循环复制 word[] 的内容。

所以这个:

for (int i = 0; i <= find_length(input); i++){
    if(input[i] == ' ' || i == find_length(input)){
        words[position] = word;
        printf("%s%d ",words[position], position);
        position++;
        counter = 0;
        word[0] = '\0';
    }

会变成这样:

for (int i = 0; i <= find_length(input); i++) {
    if(input[i] == ' ' || i == find_length(input)) {
    words[position] = malloc(sizeof(char) * (counter + 1));
        for (int j = 0; j < counter; j++)
            words[position][j] = word[j];
        words[position][counter] = '\0';
        printf("%s%d ", words[position], position);
        position++;
        counter = 0;
        word[0] = '\0';
    }

【讨论】:

  • 我试过这个,它给出了分段错误。我是否正确初始化数组?
  • 我假设您的find_length() 的行为与strlen() 完全相同。也许我对您的实施有误。如果你用strlen() 替换你的函数,段错误还会发生吗? (只是为了测试..我知道你不能使用strlen()
  • 即使用 strlen() 替换后,我仍然遇到 seg 错误
  • 哦,忘了我说的话。我认为你的段错误来自这样一个事实,即你的 while 循环最后从 0 变为 5(不包括),而它应该从 0 变为 3(不包括)
  • 不,问题是内存分配错误。我将单词数组的初始化更改为 **words 并通过 malloc 分配内存。现在它工作正常。但是,您的答案在将一个数组的值而不是指针复制到另一个数组时是正确的,所以谢谢。
【解决方案2】:

用这个sn-p替换最后几行:

position = 0;

while(position < 5) {
    printf("%s%d ", words[position], position);
    position++;
}

【讨论】:

  • 谢谢,解决了 0 个问题。但这并没有解决数组的问题。
猜你喜欢
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2021-08-03
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
相关资源
最近更新 更多