【问题标题】:Transferring values from a char array to an integer array in C programming在 C 编程中将值从 char 数组传输到整数数组
【发布时间】:2015-08-22 06:55:09
【问题描述】:

我遇到以下问题。我创建了一个 char 数组,它代表一系列字符和数字——它旨在模拟从文本文件中读取或获取的字符串。然后我希望使用下面定义的“搜索”函数搜索这个字符串,只提取“H”之前的数字并分配给一个单独定义的整数数组。我发现当我使用 gdb 时,这个功能可以正常工作。然而,只有部分数组被返回——确切地说是前 8 个元素。谁能通过查看下面的代码来解释为什么会这样?

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

void search(char buffer[], int size, int array[]);

int main (void)
{
    char buffer[1000];
    memset(buffer, 0, sizeof(buffer)); 

    buffer[0] = 2;
    buffer[1] = 'H';
    buffer[2] = 3;
    buffer[3] = 'H';  
    buffer[4] = 6;
    buffer[5] = 'H'; 
    buffer[6] = 4; 
    buffer[7] = 'H'; 
    buffer[8] = 6; 
    buffer[9] = 'H';
    buffer[10] = 7;
    buffer[11] = 'H';
    buffer[12] = 11;
    buffer[13] = 'H';
    buffer[14] = 12;
    buffer[15] = 'H';
    buffer[16] = 17;
    buffer[17] = 'H'; 

    int* array ;    
    array = malloc(sizeof(buffer) * sizeof(int));  

    search(buffer, sizeof(buffer), array); 

    for(int i = 0, n = sizeof(array); i < n; i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    } 

    free(array); 
}

void search(char buffer[], int size, int array[])
{
    int position = 0;

    for (int i = 0; i < size; i++)
    {
        if(buffer[i] == 'H')
        {
            *(array + position) = buffer[i-1];
            position++;
        }
    }       
}

编译器输出如下:

array[0] = 2
array[1] = 3
array[2] = 6
array[3] = 4
array[4] = 6
array[5] = 7
array[6] = 11
array[7] = 12

可以看出,它缺少数组中的第九个位置 - 值 17。事实上,如果我将一组更大的数字和“H”放入缓冲区,我总是会返回一个大小为 8 的数组。为什么这是?任何帮助将不胜感激。

【问题讨论】:

  • 您将 sizeof(buffer) 传递给 search(),而不是您使用的元素数量 - 18。
  • buffer[i-1];i == 0 时的未定义行为
  • @WeatherVane sizeof(buffer) 表示array 的元素数。 buffer[i-1]; 如果(buffer[i] == 'H')
  • @BLUEPIXY 请仔细阅读我的 cmets。
  • @WeatherVane 您不需要传递您正在使用的元素数量。当i == 0时,将无法访问buffer[i-1]

标签: c arrays sizeof


【解决方案1】:

问题出在

n = sizeof(array)

array 是一个指针,sizeof(array) 会给你指针的大小(sizeof(array) 这里基本上 sizeof(int *),对于你的平台来说似乎是 8),不是array 中的累积大小(或元素数)。

获得所需内容的一种可能方法是search() 返回放入array 的元素计数,并在for 循环中使用该返回值从array 打印所需的元素。

【讨论】:

  • 您好,谢谢,您是绝对正确的,这是一种享受!干杯!
【解决方案2】:

n = sizeof(array) 替换为n = strlen(buffer) / 2 即可(您希望n 成为数组中填充元素的数量)。

顺便说一句,

  • 您需要确保buffer 始终具有正确的配对。
  • 这样声明缓冲区会更安全char buffer[1000] = "";
  • “我总是返回一个大小为 8 的数组” - 这是因为 64b 机器中的 sizeof(int) 是 8 个字节,这是您从 sizeof(array) 得到的 - 因为 array 这里是指针。

【讨论】:

    猜你喜欢
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多