在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;
}
此代码永远不会到达“SUCCESS”部分。这跟我说要么
(1)更改的值并未指向正确的事物 (2)指针&amp; a不正确 (3)我完全错了,这是别的什么
任何帮助都将不胜感激。
答案 0 :(得分:1)
声明
bufferArrays[counter] = "a";
不合法。它指定一个指向单个char
的指针,并且应该给出编译器错误(或者至少是一个警告)。而是尝试
bufferArrays[counter] = 'a';
此外,在 while
循环(两者都是)中,您不会增加counter
,因此会一遍又一遍地遍历相同的索引。
修改:其他问题
您进行比较的条件也存在缺陷:
memcmp(&a, changed, 4)
上面没有比较指针,它比较指针指向的内容,并且比较四个字节,而内容只是一个字节。此外,您无法比较指针,因为它们将不同;变量a
的内容存储在与bufferArrays[counter][i]
内容不同的位置。
答案 1 :(得分:1)
此:
bufferArrays[counter] = "a"; //all the buffers contain one "a"
是错误的,因为bufferArrays[counter]
不是字符指针而是字符数组。你需要:
strcpy(bufferArrays[counter], "a");
此外,您没有显示readTOmodify
,因此该部分有点难以理解。
此外,字符串最好与strcpy()
进行比较,后者逐个字符地进行比较,并在终止'\0'
处停止。您使用memcmp()
,我不明白4
的原因,即您要比较的字节数。
答案 2 :(得分:1)
1)bufferArrays [counter] =“a”; //所有缓冲区都包含一个“a”
这不行,您必须使用strcpy
复制字符串:
strcpy(bufferArrays[counter],"a"); //all the buffers contain one "a"
2)
#define BUFFER_LENGTH 1
这是一个问题。如果您只想存储一个char(用于额外的空终止),则缓冲区长度应至少为2。
3)在你的两个循环中,你永远不会改变counter
,这会导致无限循环。
你的代码在哪里?我没有看到它周围的任何功能。
修改强> 要分配你也可以使用:
while(counter < NUM_BUFFERS)
{
bufferArrays[counter][0] = 'a'; //all the buffers contain one "a"
counter++;
}
在任何情况下,如果要将其用作C字符串,则必须将缓冲区长度设置为2.
答案 3 :(得分: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
的指针,其内存地址为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");