乱码输出
Garbled string output
我目前正在做一项作业,要求我审查 argv 和输入重定向的单词。
我的问题在我的输出中很明显,可以在下面找到。我有很多跟踪打印语句,它们可能会或可能不会帮助您指出我的问题。
我的意图是:
- 获取
file.txt
- 将
file.txt
的内容复制到buffer[x][y]
,其中[x]
是一个字符串,[y]
是[x]
的一个字符。
- 比较
argv[]
参数与 buffer[][]
。
- 创建
newstr[size2]
。对于 buffer[][]
中的每个 argv[]
争论,将其替换为 replace[9] = "CENSORED"
。
- 打印
newstr[0 to (size2-1)]
的字符串。
这是我的代码:
// censored.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 128
int main ( int argc, char* argv[])
{
int i = 0;
int j = 0;
int k = 0;
char buffer[SIZE][SIZE];
char x;
int count = 0;
int size1 = sizeof(buffer);
int size2 = 0;
char replace[9] = "CENSORED";
int buffersize=0;
printf("tracing: size1: %d.\n", size1);
printf("tracing: argc: %d.\n", argc);
while((fscanf(stdin, "%c", &x)!=EOF))
{
if(isalpha(x))
{
buffer[i][j]=x;
printf("tracing: buffer[%d][%d]: %c\n", i,j, buffer[i][j]);
j++;
}
else if(isspace(x)) // if whitespace
{
j = 0;
i++;
buffer[i][j]=x;//this should be buffer[i][j]
printf("tracing: buffer[%d][%d]: %c\n", i,j, buffer[i][j]);
j = 0;
i++;
}
else if(ispunct(x)) // if x is a punctuation
{
j = 0;
i++;
buffer[i][j]=x;//this should be buffer[i][j]
printf("tracing: buffer[%d][%d]: %c\n", i,j, buffer[i][j]);
}
else if(iscntrl(x)) // if control key (\n, \r etc...)
{
j = 0;
i++;
buffer[i][j]=x;//this should be buffer[i][j]
printf("tracing: buffer[%d][%d]: %c", i,j, buffer[i][j]);
j = 0;
i++;
}
else if(isdigit(x))
{
buffer[i][j]=x;//this should be buffer[i][j]
printf("tracing: buffer[%d][%d]: %c\n", i,j, buffer[i][j]);
j++;
}
else
{
break;
}
}
size2 = i;
printf("tracing: buffer[8][0]:%s\n",buffer[8]);
char newstr[size2][SIZE];
i = 0;
j = 0;
// tracing:
printf("tracing: line 72\n");
printf("tracing: size2: %d.\n", size2);
while(i < size2) //print buffer[]
{
printf("%s", buffer[i]);
i++;
}
printf("tracing: line 80\n");
for(k=1; k < argc; k++)
{
printf("%s\n", argv[k]);
}
// end tracing
i = 0; //reinitialize i
j = 0; //reinitialize j
// creating newstr[SIZE] and censoring words
printf("tracing: line 89\n");
for(i = 0; i < size2; i++)
{
for(j=1; j < argc; j++)
{
if(strcmp(buffer[i], argv[j])==0)
{
strcpy(newstr[i], &replace[0]);
printf("tracing: replaced at [%d]\n", i);
break;
}
else
{
strcpy(newstr[i], buffer[i]);
printf("tracing: copied at [%d]\n", i);
}
}
}
i = 0; //reinitialize i
while(i < size2)
{
printf("%s", newstr[i]);
i++;
}
return 0;
}
假设我有一个名为 file.txt
的输入重定向文件及其内容:
Said Hamlet to Ophelia,
I'll draw a sketch of thee,
What kind of pencil shall I use?
2B or not 2B?
我的输入是:
./censored Ophelia thee 2B < file.txt
这是我得到的奇怪输出:
Said Hamlet to CENSORED, Ill draw a sketch ???)ofoQ? ?"h?CENSORED,2oQ?
What? /oQ?kind? of 6oQ?pencil +oQ?shall ?"h?I-oQ? ???)use? ???2BoQ?
7oQoroQ Qnot 1oQ?CENSORED?4oQ?
感谢任何帮助,我知道我的代码很乱,这是我学习 C 的第一学期。
我有好消息和坏消息,坏消息是:我发现了一些错误和失误。
好的是:所有这些对于初学者来说都是常见的!
第一个:buffer[]
中的字符串没有以 '[=11=]'
结束,这是字符串结束指示符。这是你的问题的一个原因。
这是其他的:
- 字符缓冲区[SIZE][SIZE];
在这里,您正在考虑单词的数量和单词的长度不能超过 128,这将在这种情况错误时导致 Segmentation Fault。我建议你了解动态分配 (malloc())。
- for(j=1; j < argc; j++) 如果 argc == 1,您将不会进入此循环,这将导致
newstr
为空。通常我们以 NULL 指针结束数组,然后在读取数组时检查数组的每个字符串是否为非空,这样我们就不会尝试使用未定义的内容。
- 正如您所指出的,您的代码非常混乱,下次尝试将您的代码分成函数,而不是在
main()
中编码。
- 尝试减少它,你写的行越少,你的代码就越容易阅读和调试:
j = 0;
i++;
buffer[i][j]=x;//this should be buffer[i][j]
printf("tracing: buffer[%d][%d]: %c\n", i,j, buffer[i][j]);
j = 0;
i++;
- 这条建议与那种旨在读取大量数据的程序并不相关,但请记住:尽可能避免存储数据。
我想这就足够了,祝你好运,并为我糟糕的英语道歉。
我目前正在做一项作业,要求我审查 argv 和输入重定向的单词。
我的问题在我的输出中很明显,可以在下面找到。我有很多跟踪打印语句,它们可能会或可能不会帮助您指出我的问题。
我的意图是:
- 获取
file.txt
- 将
file.txt
的内容复制到buffer[x][y]
,其中[x]
是一个字符串,[y]
是[x]
的一个字符。 - 比较
argv[]
参数与buffer[][]
。 - 创建
newstr[size2]
。对于buffer[][]
中的每个argv[]
争论,将其替换为replace[9] = "CENSORED"
。 - 打印
newstr[0 to (size2-1)]
的字符串。
这是我的代码:
// censored.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 128
int main ( int argc, char* argv[])
{
int i = 0;
int j = 0;
int k = 0;
char buffer[SIZE][SIZE];
char x;
int count = 0;
int size1 = sizeof(buffer);
int size2 = 0;
char replace[9] = "CENSORED";
int buffersize=0;
printf("tracing: size1: %d.\n", size1);
printf("tracing: argc: %d.\n", argc);
while((fscanf(stdin, "%c", &x)!=EOF))
{
if(isalpha(x))
{
buffer[i][j]=x;
printf("tracing: buffer[%d][%d]: %c\n", i,j, buffer[i][j]);
j++;
}
else if(isspace(x)) // if whitespace
{
j = 0;
i++;
buffer[i][j]=x;//this should be buffer[i][j]
printf("tracing: buffer[%d][%d]: %c\n", i,j, buffer[i][j]);
j = 0;
i++;
}
else if(ispunct(x)) // if x is a punctuation
{
j = 0;
i++;
buffer[i][j]=x;//this should be buffer[i][j]
printf("tracing: buffer[%d][%d]: %c\n", i,j, buffer[i][j]);
}
else if(iscntrl(x)) // if control key (\n, \r etc...)
{
j = 0;
i++;
buffer[i][j]=x;//this should be buffer[i][j]
printf("tracing: buffer[%d][%d]: %c", i,j, buffer[i][j]);
j = 0;
i++;
}
else if(isdigit(x))
{
buffer[i][j]=x;//this should be buffer[i][j]
printf("tracing: buffer[%d][%d]: %c\n", i,j, buffer[i][j]);
j++;
}
else
{
break;
}
}
size2 = i;
printf("tracing: buffer[8][0]:%s\n",buffer[8]);
char newstr[size2][SIZE];
i = 0;
j = 0;
// tracing:
printf("tracing: line 72\n");
printf("tracing: size2: %d.\n", size2);
while(i < size2) //print buffer[]
{
printf("%s", buffer[i]);
i++;
}
printf("tracing: line 80\n");
for(k=1; k < argc; k++)
{
printf("%s\n", argv[k]);
}
// end tracing
i = 0; //reinitialize i
j = 0; //reinitialize j
// creating newstr[SIZE] and censoring words
printf("tracing: line 89\n");
for(i = 0; i < size2; i++)
{
for(j=1; j < argc; j++)
{
if(strcmp(buffer[i], argv[j])==0)
{
strcpy(newstr[i], &replace[0]);
printf("tracing: replaced at [%d]\n", i);
break;
}
else
{
strcpy(newstr[i], buffer[i]);
printf("tracing: copied at [%d]\n", i);
}
}
}
i = 0; //reinitialize i
while(i < size2)
{
printf("%s", newstr[i]);
i++;
}
return 0;
}
假设我有一个名为 file.txt
的输入重定向文件及其内容:
Said Hamlet to Ophelia,
I'll draw a sketch of thee,
What kind of pencil shall I use?
2B or not 2B?
我的输入是:
./censored Ophelia thee 2B < file.txt
这是我得到的奇怪输出:
Said Hamlet to CENSORED, Ill draw a sketch ???)ofoQ? ?"h?CENSORED,2oQ?
What? /oQ?kind? of 6oQ?pencil +oQ?shall ?"h?I-oQ? ???)use? ???2BoQ?
7oQoroQ Qnot 1oQ?CENSORED?4oQ?
感谢任何帮助,我知道我的代码很乱,这是我学习 C 的第一学期。
我有好消息和坏消息,坏消息是:我发现了一些错误和失误。 好的是:所有这些对于初学者来说都是常见的!
第一个:buffer[]
中的字符串没有以 '[=11=]'
结束,这是字符串结束指示符。这是你的问题的一个原因。
这是其他的:
- 字符缓冲区[SIZE][SIZE]; 在这里,您正在考虑单词的数量和单词的长度不能超过 128,这将在这种情况错误时导致 Segmentation Fault。我建议你了解动态分配 (malloc())。
- for(j=1; j < argc; j++) 如果 argc == 1,您将不会进入此循环,这将导致
newstr
为空。通常我们以 NULL 指针结束数组,然后在读取数组时检查数组的每个字符串是否为非空,这样我们就不会尝试使用未定义的内容。 - 正如您所指出的,您的代码非常混乱,下次尝试将您的代码分成函数,而不是在
main()
中编码。 - 尝试减少它,你写的行越少,你的代码就越容易阅读和调试:
j = 0;
i++;
buffer[i][j]=x;//this should be buffer[i][j]
printf("tracing: buffer[%d][%d]: %c\n", i,j, buffer[i][j]);
j = 0;
i++;
- 这条建议与那种旨在读取大量数据的程序并不相关,但请记住:尽可能避免存储数据。
我想这就足够了,祝你好运,并为我糟糕的英语道歉。