我是C语言新手,在尝试输入字符串时遇到了问题。更具体地说,当打印字符串时,字符“ N”出现在字符串的结尾,因此,我无法测量字符的确切数量。这是我的代码:
int main()
{
int j = 0;
char c[15];
printf("Give surname: ");
scanf(" %s", c);
for (int i = 0; i<sizeof(c) / sizeof(c[1]); i++)
{
if (isalpha(c[i]))
{
printf("%c ", c[i]);
j++;
}
}
printf("\nNumber of characters: %d", j);
return 0;
}
例如:如果输入为“ john”,则得到以下输出:
我在做什么错了?
答案 0 :(得分:3)
这是因为您在长度大于实际字符串的字符数组上使用sizeof
运算符。
如上所述,您可以使用strlen
中的string.h
,也可以简单地遍历字符直到\0
,就像这样:
char * p = c;
while(*p++)
if (isalpha(*p))
printf("%c ", *p);
如果您对字符数感兴趣,可以减去指针。
答案 1 :(得分:3)
您的循环限制是错误的。这导致您评估不确定数据。事情特别不对:
scanf
的成功c[]
数组。所有这些都可以修复,其中一些琐碎。
scanf
是否返回了1
c
数组为15个字符,并且必须为终止nullchar占用空格,因此请使用%14s
作为格式字符串strlen
作为for的限制(以某种方式,将其保存到临时或直接在条件子句中)或使用指针。关于最后一项,我更喜欢后者,因为您只扫描一次字符串 。 strlen
将扫描字符串以找到终止符,从而计算长度并将其返回。然后在迭代过程中再次扫描 。您可以不使用strlen
扫描而无需使用扫描,而只需使用指针,然后在发现终止符时停止扫描即可。
重写,结果如下:
#include <stdio.h>
#include <ctype.h>
int main()
{
char c[15];
int j = 0;
printf("Give surname: ");
if (scanf("%14s", c) == 1)
{
for (const char *p = c; *p; ++p)
{
if (isalpha(*p))
{
printf("%c ", *p);
++j;
}
}
printf("\nNumber of characters: %d", j);
}
return 0;
}
输入
123john456
输出
j o h n
Number of characters: 4
答案 2 :(得分:2)
尝试改用strlen()
函数。它会检查实际字符串末尾的空终止字符(而不是完整数组,完整数组可能会在后面包含垃圾字符)空终止符)。
int length = strlen(c);
for (int i = 0; i < length; i++){
记住#include <string.h>
在此处查看其运行情况: https://repl.it/repls/SugaryUnfoldedCleaninstall
如果您想知道为什么需要依靠函数来执行此操作,请查看the source of strlen()
。编写一个在所有情况下都能正常运行的功能,要比看起来困难得多。