c - 输出未包含所有字符
问题描述
我试图输入一串字符,只分别输出最后一个和第一个字符。下面是我正在使用的代码。
#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
解决方案
您的代码中的几个问题:
在这份声明中
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()来自用户的输入。
推荐阅读
- sql - 通过多任务处理更新 SQL Server 2008 表时出现死锁
- python - 使用 k.clear_session() 和 tf.reset_default_graph() 清除后续模型之间的图形
- amazon-kinesis - 如何从 aws kinesis 流式传输实时数据以响应基于前端
- c - 在 C 中使用结构时的内存分配
- spring - 如果 kafka 关闭,弹簧执行器“健康”指标不会响应
- postgresql - 读取时带时区的 PostgreSQL 时间戳应用偏移量
- rx-swift - 处理时如何调用方法
- ios - 自定义字体可以在 Storyboard 中使用吗?
- android - 检测Android上安装的GameGuardian/防止GameGuard修改值
- java - Cucumber - Java8 - 使用 @Before 和 lambda 表达式