检查 C 中的空白程序是否正常工作
Checking for whitespace program in C not working properly
我正在尝试检查充满字符的文件中的连续空格。我希望我的程序在一系列字符后忽略一个以上的空格。此外,制表符将替换为空格。我正在打开一个文件并阅读它,所以不要担心那部分代码,因为它可以工作。我的代码:
char ch;
char sentenceArray[1000];
int charCount = 0;
while (1) {
ch = getc(file);
//If is some sort of space, check it
if(ch == ' '){
if(sentenceArray[charCount-1] != ' '){
sentenceArray[charCount] = ' ';
}
}else if(ch == '\t'){
if(sentenceArray[charCount-1] != ' '){
sentenceArray[charCount] = ' ';
}
}else{
printf("Not space");
sentenceArray[charCount] = ch;
}
charCount++;
}
void print()
{
int i;
for(i = 0; i<= charCount; i++){
printf("%c", sentenceArray[i]);
}
}
main 中唯一相关的行是:
print();
如果我给它一个文件:
myprog < file1
我的文件内容如下:
Uno Dos Tres Cuatro a
Uno 和 Dos 之间有 1 个空格,Dos 和 Tres 之间有 2 个空格,Tres 和 Cuatro 之间有 3 个空格,Cuatro 和 a 之间有一个制表符。
这是输出(我打印数组):
Uno Dos Tres Cuatro a
如您所见,我的程序成功地只消除了 2 个连续空格...如果它们更多,它只会继续删除两个,但如果它们更多,比如 10 个,它只取出 2 个,然后打印8 个空格。
你知道为什么会这样吗?我的代码有什么缺陷?
谢谢!
每次获得新角色时,您都在递增 charCount
。您应该只在向输出添加新字符时更新 charCount
。
否则,在遇到第二个 space 后,您将与未知值(或 sentenceArray
初始化为的任何值)进行比较,这将导致检查 if(sentenceArray[charCount-1] != ' ')
结果正确并添加另一个 space。
//If is some sort of space, check it
if ((ch == ' ') || (ch == '\t')){
if((charCount == 0) || (sentenceArray[charCount-1] != ' '))
{
sentenceArray[charCount] = ' ';
charCount++; // <-- added this here
}
}else{
printf("Not space");
sentenceArray[charCount] = ch;
charCount++; // <-- added this here
}
// charCount++; <-- remove this
附带说明一下,您可能想看看使用 isspace()
如果前一个char
是白色-space,代码需要跟踪。
// char ch;
int ch;
char sentenceArray[1000];
int charCount = 0;
int previous_space = 0;
while ((ch = getc(file)) != EOF && charCount < 1000) {
if (isspace(ch)) {
if (!previous_space) {
sentenceArray[charCount++] = ' ';
previous_space = 1;
}
}
else {
sentenceArray[charCount++] = ch;
previous_space = 0;
}
}
我正在尝试检查充满字符的文件中的连续空格。我希望我的程序在一系列字符后忽略一个以上的空格。此外,制表符将替换为空格。我正在打开一个文件并阅读它,所以不要担心那部分代码,因为它可以工作。我的代码:
char ch;
char sentenceArray[1000];
int charCount = 0;
while (1) {
ch = getc(file);
//If is some sort of space, check it
if(ch == ' '){
if(sentenceArray[charCount-1] != ' '){
sentenceArray[charCount] = ' ';
}
}else if(ch == '\t'){
if(sentenceArray[charCount-1] != ' '){
sentenceArray[charCount] = ' ';
}
}else{
printf("Not space");
sentenceArray[charCount] = ch;
}
charCount++;
}
void print()
{
int i;
for(i = 0; i<= charCount; i++){
printf("%c", sentenceArray[i]);
}
}
main 中唯一相关的行是:
print();
如果我给它一个文件:
myprog < file1
我的文件内容如下:
Uno Dos Tres Cuatro a
Uno 和 Dos 之间有 1 个空格,Dos 和 Tres 之间有 2 个空格,Tres 和 Cuatro 之间有 3 个空格,Cuatro 和 a 之间有一个制表符。
这是输出(我打印数组):
Uno Dos Tres Cuatro a
如您所见,我的程序成功地只消除了 2 个连续空格...如果它们更多,它只会继续删除两个,但如果它们更多,比如 10 个,它只取出 2 个,然后打印8 个空格。
你知道为什么会这样吗?我的代码有什么缺陷?
谢谢!
每次获得新角色时,您都在递增 charCount
。您应该只在向输出添加新字符时更新 charCount
。
否则,在遇到第二个 space 后,您将与未知值(或 sentenceArray
初始化为的任何值)进行比较,这将导致检查 if(sentenceArray[charCount-1] != ' ')
结果正确并添加另一个 space。
//If is some sort of space, check it
if ((ch == ' ') || (ch == '\t')){
if((charCount == 0) || (sentenceArray[charCount-1] != ' '))
{
sentenceArray[charCount] = ' ';
charCount++; // <-- added this here
}
}else{
printf("Not space");
sentenceArray[charCount] = ch;
charCount++; // <-- added this here
}
// charCount++; <-- remove this
附带说明一下,您可能想看看使用 isspace()
如果前一个char
是白色-space,代码需要跟踪。
// char ch;
int ch;
char sentenceArray[1000];
int charCount = 0;
int previous_space = 0;
while ((ch = getc(file)) != EOF && charCount < 1000) {
if (isspace(ch)) {
if (!previous_space) {
sentenceArray[charCount++] = ' ';
previous_space = 1;
}
}
else {
sentenceArray[charCount++] = ch;
previous_space = 0;
}
}