字符串无法在C中正确打印

时间:2017-08-24 07:55:20

标签: c

我在独立函数中使用while循环打印字符串时遇到问题。

我有以下代码:

#include <stdio.h>
int pword(char *);
int main() {
    char s[] = "Alice";
    pword(s);
    return 0;
}

int pword(char *s) {
    while(*s!='\0') {
        printf("%s", s);
        s++;
    }
    printf("\n");
    return 0;
}

这是印刷: Aliceliceicecee

4 个答案:

答案 0 :(得分:4)

您每次都打印 offseted 字,而不是字符。

尝试更改(例如)

printf("%s", s);

通过

printf("%c", *s);

或者由于您不需要格式化,请使用

putchar(*s);

(这意味着你基本上用循环重写puts。所以如果不需要对字符进行进一步处理,也许你应该坚持使用标准函数)

答案 1 :(得分:1)

%s表示期望const char *参数

%c表示期待一个字符参数。打印字符参数。空字符被忽略;

你正在寻找一个。

%s的更多信息:参数被认为是一个字符串(字符指针),字符串中的字符 打印直到空字符或直到由字符指示的字符数 达到精度规格;但是,如果精度为0或缺少,则打印所有最多为null的字符;

答案 2 :(得分:1)

看不到答案解释了到底发生了什么,这是你实际做的事情:

int pword(char *s) {      /* s = "Alice" (s is a char* that holds the address of "Alice" string)*/
    while(*s!='\0') {     /* check if the first char pointed to by s != '\0' */
    printf("%s", s);      /* print the string that start at s*/
    s++;                  /* move s (the char pointer) 1 step forward*/
  }                       /* s points to "lice" -> "ice" -> "ce" -> "e" */
    printf("\n");
    return 0;
}

为了打印字符串&#34; Alice&#34;您可以使用printf("%s", s);,因为它会占用s指向的地址,其中&#34; Alice&#34;存储,并打印它直到到达 null-terminator '\0')。

如果您想使用循环并按char打印char,则应使用printf("%c", *s);。使用%c用于打印char,其中%s用于打印字符串。需要注意的另一件事是s vs *s,其中前者是char* (pointer to char),可以保存连续char个,后者(*s)*(char*),即取消引用char*,只保留一个char

总结一下:

char

打印char
int pword(char *s) {
    while(*s!='\0') {
    printf("%c", *s);
    s++;
  }
    printf("\n");
    return 0;
}

立即打印整个字符串

int pword(char *s) {
    printf("%s\n", s);
    return 0;
}

答案 3 :(得分:-1)

如果你想逐个字符地打印,你应该在printf语句中使用*s,如下所示。

  #include <stdio.h>
    int pword(char *);
    int main() {
        char s[] = "Alice";
        pword(s);
        return 0;
    }

    int pword(char *s) {
        while(*s!='\0') {
        printf("%c", *s);
        s++;
      }
        printf("\n");
        return 0;
    }