首页 > 解决方案 > 输出未包含所有字符

问题描述

我试图输入一串字符,只分别输出最后一个和第一个字符。下面是我正在使用的代码。

#include<stdio.h>
int main(){

    for(int i=0;i<3;i++){
        int n; // length of the string
        char string[101];

        scanf("%d %s", &n, &string);
        fflush(stdin); // sometimes I also use getchar();

        printf("%c%c", string[n+1], string[0]);
    }

    printf("\n");
    
    return 0;
}

我正在使用 for 循环,因为我想输入字符串 3 次,但是当我运行代码时,输​​入不是我所期望的。如果我输入例如

5 abcde

输出

 a //there's space before the a

你能帮我告诉我哪里出错了吗?

输入:

5 abcde
6 qwerty
3 ijk

预期输出:

ea
yq
ki

标签: cstringchar

解决方案


您的代码中的几个问题:

在这份声明中

scanf("%d %s", &n, &string);

你不需要给&操作员string. 数组名称在表达式中使用时会转换为指向第一个元素的指针(此规则很少有例外)。此外,string数组的大小是101字符,但如果您提供的输入多于101字符,scanf()最终访问的string数组将超出其大小。当输入大小超过此值时,您应该限制scanf()为不读取数组中的多个100字符。string(保留剩余的一个字符空间用于scanf()添加的空终止字符)。为此,您可以在格式说明符 - 中提供宽度修饰符%100s

您没有针对来自用户的输入字符串验证字符串长度输入。如果输入字符串的长度大于或小于输入字符串的实际长度,会发生什么情况!

fflush(stdin)是未定义的行为,因为根据标准,fflush只能与输出流一起使用。

我试图输入一串字符,只分别输出最后一个和第一个字符。

为此,您不需要将字符串的长度作为用户的输入。使用标准库函数 - strlen(). 如果未正确验证,这也将防止您的程序因用户输入错误的长度而出现问题。

把这些放在一起,你可以这样做:

#include <stdio.h>
#include <string.h>

int main (void) {

    for (int i = 0; i < 3 ; i++) {
        char string[101];

        printf ("Enter string:\n");
        scanf("%100s", string);
        printf("Last character: %c, First character: %c\n", string[strlen(string) - 1], string[0]);

        int c;
        /*discard the extra characters, if any*/
        /*For e.g. if user input is very long this will discard the input beyond 100 characters */
        while((c = getchar()) != '\n' && c != EOF)
            /* discard the character */;
    }

    return 0;
}

请注意,scanf(%<width>s, ......)读取最多width或直到第一个空白字符,以先出现者为准。如果要在输入中包含空格,可以使用适当的转换说明符 inscanf()或更好的替代方法是使用fgets()来自用户的输入。


推荐阅读