“ N”字符出现在字符串的末尾

时间:2018-09-01 20:04:28

标签: c string scanf

我是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”,则得到以下输出:

enter image description here

我在做什么错了?

3 个答案:

答案 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()。编写一个在所有情况下都能正常运行的功能,要比看起来困难得多。

进一步阅读
How to iterate over a string in C