我在独立函数中使用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 。
答案 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;
}