如何在C语言中截断超过一定长度的字符?
我正在开发一个C程序,它接收一行文本的输入,并通过每个只打印40个字符来返回。 到目前为止,我有以下代码:如何在C语言中截断超过一定长度的字符?,c,loops,char,getchar,putchar,C,Loops,Char,Getchar,Putchar,我正在开发一个C程序,它接收一行文本的输入,并通过每个只打印40个字符来返回。 到目前为止,我有以下代码: #include <stdio.h> #include <stdlib.h> int main() { char input = getchar(); int numChar; int total; while ((input != EOF) && (input != '\n')) { ++numC
#include <stdio.h>
#include <stdlib.h>
int main() {
char input = getchar();
int numChar;
int total;
while ((input != EOF) && (input != '\n')) {
++numChar;
if (numChar > 40) {
printf("\n");
++total;
numChar = 0;
}
putchar(input);
input = getchar();
}
return EXIT_SUCCESS;
}
#包括
#包括
int main(){
char输入=getchar();
内努姆查尔;
整数合计;
而((输入!=EOF)&&(输入!='\n')){
++纽卡;
如果(numChar>40){
printf(“\n”);
++总数;
numChar=0;
}
putchar(输入);
input=getchar();
}
返回退出成功;
}
刚刚用我的新草稿更新了我的帖子。对于这个尝试,我试图打印每个字符,因为它需要每个输入,但如果字符计数超过40,使一个新的行。但是,我没有得到预期的输出。我不确定这是否是您的要求。基本上每40个字符,就会打印一个
换行符
#include <stdio.h>
int main(void)
{
int c = 0;
size_t i = 0;
while ((c = getchar()) != EOF)
{
if (i++ < 40)
{
putchar(c);
}
else if (i++ > 40 && c !='\n')
{
i = 1;
printf("\n%c",c);
}
if (c == '\n')
{
i = 0;
}
}
return 0;
}
#包括
内部主(空)
{
int c=0;
尺寸i=0;
而((c=getchar())!=EOF)
{
if(i++<40)
{
普查尔(c);
}
如果(i++>40&&c!='\n')为else
{
i=1;
printf(“\n%c”,c);
}
如果(c=='\n')
{
i=0;
}
}
返回0;
}
编辑:
如果初始化numChar
-->numChar=0
和total
-->
int numChar;
int total;
因此程序具有未定义的行为
此外,程序中未使用变量<代码>总计<代码>的累积值
变量input
必须声明为具有类型int
请注意,最后输出的子字符串可以包含少于40个字符。在这种情况下,你需要打电话
putchar( '\n' );
也是在循环之后
使用通过函数getchar
输入字符的方法,程序可以如下所示
#include <stdio.h>
int main(void)
{
const size_t LINE_LENGTH = 40;
size_t count = 0;
for ( int c; ( c = getchar() ) != EOF && c != '\n'; )
{
putchar( c );
if ( ++count % LINE_LENGTH == 0 )
{
putchar( '\n' );
count = 0;
}
}
if ( count % LINE_LENGTH != 0 ) putchar( '\n' );
return 0;
}
实际上,字符串是以空字符“\0”结尾的字符序列,因此字符串是字符数组 您可以轻松地在字符串上进行迭代,直到遇到空字符,并且在每次迭代中打印当前字符,如果字符索引是40的倍数,则打印新行字符,这样每40个字符分割一个字符串 下面是代码:
#include <stdio.h>
#define MAX_LENGHT 200
int main () {
char input[MAX_LENGHT];
fgets(input, MAX_LENGHT, stdin);
int index = 0;
while (input[index++] != '\0') {
putchar(input[index]);
if (index % 40 == 0) {
putchar('\n');
}
}
}
#包括
#定义最大长度200
int main(){
字符输入[最大长度];
fgets(输入、最大长度、标准输入);
int指数=0;
while(输入[index++]!='\0'){
putchar(输入[索引]);
如果(索引%40==0){
putchar('\n');
}
}
}
存在多个问题:
和numChars
未初始化,您将获得未定义的行为total
- 在阅读换行符时,您仅在停止时处理第一行文本
#include <stdio.h>
#include <stdlib.h>
int main() {
int pos = 0, c;
while ((c = getchar()) != EOF) {
if (c == '\n') {
putchar(c);
pos = 0;
} else
if (pos < 40) {
putchar(c);
pos++;
} else {
// ignore the character beyond the first 40
}
}
return EXIT_SUCCESS;
}
#包括
#包括
int main(){
int pos=0,c;
而((c=getchar())!=EOF){
如果(c=='\n'){
普查尔(c);
pos=0;
}否则
如果(位置<40){
普查尔(c);
pos++;
}否则{
//忽略超过前40个字符的字符
}
}
返回退出成功;
}
如果忽略第40个位置后的字符串:returnInput[40]=0;printf(“%s\n”,returnInput)代码>intnumchar代码>->int numChar=0代码>和相同的total
input
需要是int
而不是char
(因为EOF
是一个与任何char
不同的值)。在EOF为-1且char已签名的常见系统上,EOF与char的值相同。它必须是int
,因为getchar返回的int值超出了char
的范围。描述有点含糊不清,您的意思是每行输入最多打印40个字符吗?还是你想让它停在第一线?或者你想把超过40个字符的行分成更小的块吗?太棒了,非常感谢!好像我忘了初始化哈哈。你误解了一个问题,输入被授权为一行文本,OP希望每行最多打印40个字符format@Davide:OP的问题是不明确的:一个C程序,它接收一行文本的输入,并通过每个只打印40个字符来返回。我把复数解释为行,每个单词的意思是:一个C程序,每行输入最多打印40个字符。我可能错了,让我们问问OP。@Davide:truncate通常被解释为丢弃多余的字符,但OP可能意味着打断或换行长度超过40个字符,代码确实试图这样做。是的,这个问题确实模棱两可。但是如果你看OP的代码,当发现一个换行符时,他会停下来打印(所以他假设输入是一行),并且每隔40行打印一个换行符characters@Davide:是的,她这样做了,但经典智慧说:如果代码和注释不一致,那么两者都可能是错误的:)
#include <stdio.h>
int main() {
char c;
for(int i = 0; (c = getchar()) != EOF; i++) {
if( !(i % 40) ) puts("");
putchar(c);
}
return 0;
}
if( i && !(i % 40) ) puts("");
#include <stdio.h>
#include <stdlib.h>
int main() {
int pos = 0, c;
while ((c = getchar()) != EOF) {
if (c == '\n') {
putchar(c);
pos = 0;
} else
if (pos < 40) {
putchar(c);
pos++;
} else {
// ignore the character beyond the first 40
}
}
return EXIT_SUCCESS;
}