为什么我的代码会多次打印整个字符串而不是一次?

时间:2013-04-18 16:02:15

标签: c pointers command-line input command-line-arguments

我是C的新手。在阅读输入和指针时,我在理解一些基本材料方面遇到了一些麻烦。我想使用nextChar()函数来读取和打印我在命令行中输入的字符串的每个字符。我尝试输入“hello”..它显示“hello”6次。有人能告诉我为什么会这样吗?我该如何解决?谢谢你的时间!

#include <stdio.h>
#include <assert.h>
char nextChar(char* ptr)
{
    static int i = -1;
    char c;
    ++i;
    c = *(s+i);
    if ( c == '\0' )
        return '\0';
    else
        return c;
}

void display(char* ptr)
{
    assert(ptr != 0);

    do
    {
        printf("%s", ptr);

    } while (nextChar(ptr));
}


int main(int argc, const char * argv[])
{
    char* ptr=argv[1];

    display(ptr);
    return 0;
}

3 个答案:

答案 0 :(得分:3)

%s格式说明符指示printf打印字符数组,直到找到空终止符。如果要打印单个%c,则应使用char。如果这样做,您还需要使用nextChar的返回值。

或者,更简单地说,您可以更改display以直接迭代字符串中的字符

void display(char* ptr)
{
    assert(ptr != 0);

    do
    {
        printf("%c", *ptr); // print a single char
        ptr++; // advance ptr by a single char

    } while (*ptr != '\0');
}

或者,等效但指针运算不太明显

void display(char* ptr)
{
    int index = 0;
    assert(ptr != 0);

    do
    {
        printf("%c", ptr[index]);
        index++;

    } while (ptr[index] != '\0');
}

答案 1 :(得分:1)

可以减少nextchar函数:

char nextChar(char* ptr)
{
    static int i = 0;
    i++;
    return (*(ptr+i));
}

并显示到

void display(char* ptr)
{
    assert(ptr != 0);
    char c = *ptr;

    do
    {
        printf("%c", c);

    } while (c = nextChar(ptr));
}

答案 2 :(得分:1)

#include <stdio.h>
#include <assert.h>

char nextChar(const char* ptr){
    static int i = 0;
    char c;

    c = ptr[i++];
    if ( c == '\0' ){
        i = 0;
    }
    return c;
}

void display(const char* ptr){
    char c;
    assert(ptr != 0);

    while(c=nextChar(ptr)){
        printf("%c", c);
    }
}

int main(int argc, const char * argv[]){
    const char* ptr=argv[1];

    display(ptr);
    return 0;
}