【问题标题】:Print the characters by iterating in c通过在 c 中迭代打印字符
【发布时间】:2021-09-14 17:03:29
【问题描述】:
#include <stdio.h>

void fun(char *p) {
    if (p) {
        printf("%c", *p);
        p++;    
    }
}

int main() {
    fun("Y32Y567");
    return 0;
}

输出:Y

预期输出:Y32Y567

我的问题是为什么它没有按预期的方式工作?

【问题讨论】:

  • 为什么你会期望从没有迭代循环的代码路径中进行任何迭代,也没有递归来模拟所说的相同? 调试器中运行您的代码。你会看到这一切都是进入函数,测试p,然后打印Y,然后递增p(没有明显的原因),然后退出函数,然后退出main

标签: arrays c pointers char c-strings


【解决方案1】:

如果传递的指针p 不等于 NULL,则函数只输出一个字符,因为函数中没有任何循环。该函数仅包含检查指针 p 的 if 语句。

void fun(char* p)
{
        if(p)
        {
            printf("%c",*p);
            p++;    
        }
}

您需要一个循环来输出指向字符串的字符。

但是对于初学者来说,函数参数应该有限定符const,因为指向的字符串在函数内没有改变。

函数可以如下所示

void fun( const char* p)
{
        if ( p )
        {
            while ( *p ) putchar( *p++ );
        }
}

但如果该函数有第二个参数来指定文件,则该函数会更通用。例如

FILE * fun( const char* p, FILE *fp )
{
        if ( p )
        {
            while ( *p ) fputc( *p++, fp );
        }

        return fp;
}

在这种情况下,您可以在文件中输出一个字符串。

这是一个演示程序

#include <stdio.h>

FILE * fun( const char* p, FILE *fp )
{
        if ( p )
        {
            while ( *p ) fputc( *p++, fp );
        }

        return fp;
}

int main(void) 
{
    fputc( '\n', fun( "Y32Y567", stdout ) );
    
    return 0;
}

当然,您可以在没有循环的情况下用一个语句输出整个字符串。例如

#include <stdio.h>

FILE * fun( const char* p, FILE *fp )
{
        if ( p )
        {
            fputs( p, fp );
        }

        return fp;
}

int main(void) 
{
    fputc( '\n', fun( "Y32Y567", stdout ) );
    
    return 0;
}

【讨论】:

    【解决方案2】:

    函数fun 输入if 时只打印一个字符。您可能打算使用 while 循环,而不是单个 if 条件。此外,您的条件是错误的 - 只要不是 NULLp 的评估结果就为真,如果您传递了字符串文字,则不会发生这种情况。您可能打算测试*p,即字符p 指向:

    void fun(char* p)
    {
            while (*p) /* Here */
            {
                printf("%c",*p);
                p++;    
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多