Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中截断超过一定长度的字符?_C_Loops_Char_Getchar_Putchar - Fatal编程技术网

如何在C语言中截断超过一定长度的字符?

如何在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

我正在开发一个C程序,它接收一行文本的输入,并通过每个只打印40个字符来返回。 到目前为止,我有以下代码:

#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;
}