0

在 C 中,我想检查给定的字符数组中的任意字母,并根据它的内容进行更改。例如,字符“a”或“A”将更改为“4”(表示 4 的字符)。这对我来说是一个编码练习:)

代码如下:

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

#define NUM_BUFFERS 8
#define BUFFER_LENGTH 1024

char buffArrays[NUM_BUFFERS][BUFFER_LENGTH];

int main(int argc, const char* arg[v])
{
    const char a[] = "a";

    gzFile file;
    file = gzopen("a.txt", "rb"); //contains 8 lines of 1024 'a's
    int counter = 0;
    while(counter < NUM_BUFFERS)
    {
        gzread(file, buffArrays[counter], BUFFER_LENGTH - 1);
        counter++;
    }
    counter = 0;
    while(counter < NUM_BUFFERS)
    {
        int i = 0;
        for( i; i < BUFFER_LENGTH; i++ )
        {
            int *changed = &buffArrays[counter][i];
            if( memcmp(&a, changed, 1) == 0 )
                printf("SUCCESS\n");
        }
        counter++;
    }
    gzclose(file);
    return 0;
}

此代码永远不会到达“成功”部分。这对我说

(1) changed 的​​值没有指向正确的东西 (2) 指针 &a 不正确 (3) 我完全错了,是别的东西

任何帮助,将不胜感激。

4

4 回答 4

1

两件事情。

下面将值0x61或分配给'a'字符串。

const char a[] = 'a';

你可能更愿意写

const char a = 'a'; /* assign a character to a character */

或者

const char a[] = "a"; /* assign a string to a string */

接下来是下面的语句。int因此,您使用 a的内存地址分配一个指向 a 的指针char。当您在下一条语句中读取有效内存的范围时,它会调用未定义的行为。

int *changed = &bufferArrays[counter][i]; 

因此,您比较从两个地址开始的前四个字节。两个变量都只有一个字节宽。

if( memcmp(&a, changed, 4) == 0 )

如果您只想知道某些缓冲区中是否有“a”,为什么不直接知道。

int i, j;
for (i = 0; i < NUM_BUFFERS; i++)
  for (j = 0; j < BUFFER_LENGTH; j++)
    if (bufferArrays[i][j] == 'a') printf("got it!\n");
于 2012-09-19T07:18:23.293 回答
1

1) bufferArrays[counter] = "a"; //所有缓冲区都包含一个“a”

这不行,你必须使用strcpy复制字符串:

strcpy(bufferArrays[counter],"a"); //all the buffers contain one "a"

2)

#define BUFFER_LENGTH 1

这是一个问题。如果您只想存储一个字符(用于额外的空终止),缓冲区长度应至少为 2。

3)在你的两个循环中,你永远不会改变counter,这会导致无限循环。

你的代码在哪里?我没有看到任何围绕它的功能。

编辑: 分配你也可以使用:

while(counter < NUM_BUFFERS)
{
    bufferArrays[counter][0] = 'a'; //all the buffers contain one "a"
    counter++;
}

在任何情况下,如果要将缓冲区长度用作 C 字符串,则必须将其设置为 2。

于 2012-09-19T06:50:42.300 回答
1

该声明

bufferArrays[counter] = "a";

是不合法的。它分配一个指向单个的指针,char并且应该给出一个编译器错误(或至少一个警告)。而是尝试

bufferArrays[counter] = 'a';

此外,在while循环(它们两个)中,您不会增加counter,因此会一遍又一遍地循环遍历相同的索引。

编辑:进一步的问题

进行比较的条件也存在缺陷:

memcmp(&a, changed, 4)

上面不比较指针,它比较指针指向的内容,比较四个字节,而内容只有一个字节。此外,您不能比较指针,因为它们有所不同;变量的内容a存储在与 的内容不同的位置bufferArrays[counter][i]

于 2012-09-19T06:48:02.350 回答
1

这个:

bufferArrays[counter] = "a"; //all the buffers contain one "a"

是错误的,因为bufferArrays[counter]不是字符指针而是字符数组。你需要:

strcpy(bufferArrays[counter], "a");

另外,你不显示readTOmodify,所以这部分有点难以理解。

此外,最好将字符串与strcpy()进行比较,后者逐个字符进行比较并在终止处停止'\0'。您使用memcmp(),我不明白4您要比较的字节数的原因。

于 2012-09-19T06:48:29.820 回答