能够处于条件语句中时的 C char 指针错误
C char pointer bug when being able to be in a conditional statement
我目前正在尝试使用 strtok 操作 char 指针变量。然后在条件语句中使用它根据当前指针内容附加到数组。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 48
#define sizel 10
#define sizer 128
void show_bits(unsigned int x[]);
void clear(unsigned int x[]);
int main(void) {
char line[sizel][sizer];
unsigned int s[N];
unsigned int d[N];
unsigned int b[N];
FILE *fp1 = NULL;
int i = 0;
int tot = 0;
fp1 = fopen("LineEncoded.txt", "r");
while (fgets(line[i], sizer, fp1)) {
line[i][strlen(line[i]) - 1] = '[=10=]';
i++;
}
clear(s);
i = 0;
char * pch;
pch = strtok (line," ");
while (pch != NULL) {
if (pch == '0') {
s[i]=1;
i++;
}
else if (pch == "--" || pch == "++") {
s[i]=0;
i++;
}
pch = strtok (NULL, " ");
}
show_bits(s);
return 0;
}
void show_bits(unsigned int x[]) {
int i;
for (i = 0; i < N; i++) {
if (i % 32 == 0)
printf ("\n");
fprintf(stdout, "%d", x[i]);
}
fprintf(stdout, "\n");
}
void clear(unsigned int x[]) {
int i;
for (i = 0; i < N; i++)
x[i] = 0;
}
LineEncoded.txt 文件的内容是:
-- ++ 0 0 -- ++ ++ ++ 0 -- 0 0 0 0 -- 0 -- 0 -- 0 0 0 0 0 -- 0 -- ++ 0 0 -- ++ 0 0 -- ++ 0 0 -- ++ 0 0 -- ++ 0 0 --
我想做的是解码文件。我首先将文本文件内容放入一个 char 数组(称为 line),然后使用 strtok 将文本按 space 拆分,但随后我在放置 if 语句块时卡住了,因为输出结果是错误的,如下所示:
00000000000000000000000000000000
0000000000000000
我什至尝试用 for 循环替换 while 循环,但我不知道它是否真的起作用了。
以下解码输出应与此相同:
1010101110001110000001111000101010101010101010101
如有任何帮助,我们将不胜感激。谢谢
此声明
pch = strtok (line," ");
没有意义,因为数组line是一个包含字符串的二维数组。您需要将函数strtok应用于二维数组的每个元素。
还有这个 if 语句
if(pch == '0'){
没有意义,因为指针与字符“0”进行了比较。
这个if语句
else if(pch == "--" || pch == "++"){
将始终评估为逻辑错误,因为使用的字符串文字有自己的内存范围。所以他们的地址不等于pch中存储的地址。
也就是上面的if语句等价于
else if ( pch == &"--"[0] || pch == &"++"[0] ){
相反,您需要使用标准字符串函数 strcmp。
您可以使用标准字符串函数 memset 而不是函数 clear。例如
memset( s, 0, sizeof( s ) );
==
未定义用于比较字符串(或任何数组类型的内容)。
要相互比较字符串,您需要使用 strcmp
库函数:
if ( strcmp( pch, "0" ) == 0 )
{
// handle case where token is "0"
}
else if ( strcmp( pch, "--" ) == 0 || strcmp( pch, "++" ) == 0 )
{
// handle case where token is "++" or "--"
}
line
被定义为二维数组 - 您需要指定要标记化数组的哪一行:
pch = strtok( line[i], " " );
我目前正在尝试使用 strtok 操作 char 指针变量。然后在条件语句中使用它根据当前指针内容附加到数组。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 48
#define sizel 10
#define sizer 128
void show_bits(unsigned int x[]);
void clear(unsigned int x[]);
int main(void) {
char line[sizel][sizer];
unsigned int s[N];
unsigned int d[N];
unsigned int b[N];
FILE *fp1 = NULL;
int i = 0;
int tot = 0;
fp1 = fopen("LineEncoded.txt", "r");
while (fgets(line[i], sizer, fp1)) {
line[i][strlen(line[i]) - 1] = '[=10=]';
i++;
}
clear(s);
i = 0;
char * pch;
pch = strtok (line," ");
while (pch != NULL) {
if (pch == '0') {
s[i]=1;
i++;
}
else if (pch == "--" || pch == "++") {
s[i]=0;
i++;
}
pch = strtok (NULL, " ");
}
show_bits(s);
return 0;
}
void show_bits(unsigned int x[]) {
int i;
for (i = 0; i < N; i++) {
if (i % 32 == 0)
printf ("\n");
fprintf(stdout, "%d", x[i]);
}
fprintf(stdout, "\n");
}
void clear(unsigned int x[]) {
int i;
for (i = 0; i < N; i++)
x[i] = 0;
}
LineEncoded.txt 文件的内容是:
-- ++ 0 0 -- ++ ++ ++ 0 -- 0 0 0 0 -- 0 -- 0 -- 0 0 0 0 0 -- 0 -- ++ 0 0 -- ++ 0 0 -- ++ 0 0 -- ++ 0 0 -- ++ 0 0 --
我想做的是解码文件。我首先将文本文件内容放入一个 char 数组(称为 line),然后使用 strtok 将文本按 space 拆分,但随后我在放置 if 语句块时卡住了,因为输出结果是错误的,如下所示:
00000000000000000000000000000000
0000000000000000
我什至尝试用 for 循环替换 while 循环,但我不知道它是否真的起作用了。
以下解码输出应与此相同:
1010101110001110000001111000101010101010101010101
如有任何帮助,我们将不胜感激。谢谢
此声明
pch = strtok (line," ");
没有意义,因为数组line是一个包含字符串的二维数组。您需要将函数strtok应用于二维数组的每个元素。
还有这个 if 语句
if(pch == '0'){
没有意义,因为指针与字符“0”进行了比较。
这个if语句
else if(pch == "--" || pch == "++"){
将始终评估为逻辑错误,因为使用的字符串文字有自己的内存范围。所以他们的地址不等于pch中存储的地址。
也就是上面的if语句等价于
else if ( pch == &"--"[0] || pch == &"++"[0] ){
相反,您需要使用标准字符串函数 strcmp。
您可以使用标准字符串函数 memset 而不是函数 clear。例如
memset( s, 0, sizeof( s ) );
==
未定义用于比较字符串(或任何数组类型的内容)。
要相互比较字符串,您需要使用 strcmp
库函数:
if ( strcmp( pch, "0" ) == 0 )
{
// handle case where token is "0"
}
else if ( strcmp( pch, "--" ) == 0 || strcmp( pch, "++" ) == 0 )
{
// handle case where token is "++" or "--"
}
line
被定义为二维数组 - 您需要指定要标记化数组的哪一行:
pch = strtok( line[i], " " );