C语言 我试图在一行中打印一个短语,但是在do-while循环中有一个额外的换行符,我想知道为什么?

5rgfhyps  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(100)

晚上好,我创建了一个单词搜索程序,我的输出应该是"A palavra % está no texto!""A palavra % não está no texto!"的形式,但它看起来像这样:一个公告还没发短信呢!
我的代码是这样的:

#include <stdio.h>
#include <stdlib.h>
#define MAX 300
#define CHAR 20

int main(){
    int W, w; 
    scanf("%d ", &W); /*W is the number of words/lines in the matrix words*/
    char words[MAX][CHAR];

    for(w=0; w<W; w++){
        int c=0;
        do{
            scanf("%c", &words[w][c]);
            c++;
        }while(words[w][c-1]!= '\n' && c<CHAR);
    }
    
    /* the variable ultimate is declared in the complete code.In this example 
    the most important thing is the extra line-break in the output of the conditional if*/
    int ultimate=1, c=0;
    /*the variable l(line) is the line index of the word matrix. The c variable is the column index
    Supose that we have three words: words[0]=[NIGHT...000], words[1]=[SUN...000] and 
    words[2]=[MOON...000]*/
    int l=2;
    if(ultimate!=0){
        c=0;
        printf("A palavra ");
        do{
            printf("%c", words[l][c]);
            c++;
        }while(words[l][c-1]!='\0');
        printf(" está no texto!\n");
    }else{
        c=0;
        printf("A palavra ");
        do{
            printf("%c", words[l][c]);
            c++;
        }while(words[l][c-1]!='\0');
        printf(" não está no texto!\n");
    }                                
    return 0;
}

我试着把所有的短语放在一行,但它不起作用。我如何创建一个类型字符矩阵来注册单词,我使用了一个do-while循环来运行print代码分析行的所有字符。这个矩阵的每一行都记录了一个不同的单词,幸运的是,它正在工作!所以真实的问题是printf函数.
注:很抱歉没有标识,这个网站的问题的主体没有识别我的代码。

qni6mghb

qni6mghb1#

根据缺失的代码块以及数据是如何形成的,只有这个:
替换:

do {         
    printf("%c", palavras[l][c]);         
    c++;
} while(palavras[l][c-1]!='\0'); // see the ** note below

使用:

for( c = 0; palavras[l][c] && palavras[l][c] != '\n'; c++ )
    putchar( palavras[l][c] );

这将终止循环时,字符串的结束或一个 newline 是遇到。这也使用了轻量级的putchar()函数,而不是重量级的printf()

**注意到这个do/while()在测试字符值之前首先 * 尝试 * 打印'\0'吗?不需要!

PS:你能看到printf("A palavra ");的重复吗?
if()语句的 * 前面 * 放置一个副本,以减少重复。

相关问题