【问题标题】:Trying to break out of fgets while loop试图打破 fgets while 循环
【发布时间】:2021-12-31 21:34:58
【问题描述】:
#include <stdio.h>
#include <string.h>

int main(){
    char c[20], result[50];
    int bool = 0, count = 0, i;
    
    while(fgets(c,20,stdin) != NULL){
        int stringSize = strlen(c);
        if(stringSize == 11){
            
            int ascii = (int)(c[i]);
            
            for(i = 0; i < stringSize; i++){
            
                if(ascii >= 'A' && ascii <= 'Z'){
                    bool = 1;
                }
            }
        }
    }
        if(bool == 1){
            count++;
            strcat(result,c);
        }
    
    printf("%d", count);
    printf("%s",result);
}

早上好,我是编程新手,我已经花了很长时间在谷歌上搜索和搜索这个问题,但我似乎无法理解它。 基本上我试图过滤一个 fgets 以便它读取每个字符串,如果它们是大写字母,它们是“有效的”。但是,我什至无法让 fgets 停止接受更多输入。

编辑:想法是在结果中存储每个有 10 个大写字母的字符串,并且一旦用户没有输入 ('\0'),fgets while 循环就会中断

【问题讨论】:

  • 您是否尝试过输入 Ctrl-D (Linux) 或 Ctrl-Z (Windows)?还是在符合要求时接受一个输入字符串的想法?
  • int ascii = (int)(c[i]); 使用未初始化的i。看起来这个语句应该在循环中,而不是之前。
  • 如果想法是只接受一个全大写的字符串,则需要在每个fgets 循环开始时重置标志(不在循环外)。然后,如果任何字符不是大写,则设置标志。但问题陈述不清楚 - 请显示示例输入和所需输出。
  • 我编辑的意图,我的错,应该更清楚。只要有输入,我基本上希望它运行,并且结果只存储包含 10 个大写字母的字符串。
  • 与问题无关,但这是个坏主意:int bool = 0stdbool.h 中有一个类型 bool,一旦你需要它用于其他目的,你的代码就会中断。即使您尚未包含相关标头,也不应使用 C 标准定义的标识符。

标签: c while-loop c-strings fgets strcat


【解决方案1】:

如果你是从标准输入流中输入字符串,那么最好用下面的方式重写while循环的条件

while( fgets(c,20,stdin) != NULL && c[0] != '\n' ){

在这种情况下,如果用户只是按 Enter 键而不输入字符串,则循环将停止其迭代。

注意 fgets 可以将换行符 '\n' 附加到输入的字符串中。你应该像这样删除它

c[ strcspn( c, "\n" ) ] = '\0';

那么你可以写

size_t n = strlen( c );

if ( n == 10 )
{
    size_t i = 0;
    while ( i != n && 'A' <= c[i] && c[i] <= 'Z' ) ++i;

    bool = i == 10;
}

请注意,使用名称bool 是个坏主意,因为这样的名称是作为宏在标题&lt;stdbool.h&gt; 中引入的。

似乎也是这个 if 语句

    if(bool == 1){
        count++;
        strcat(result,c);
    }

必须在 while 循环内。并且数组结果必须进行初始初始化

char c[20], result[50] = { '\0' };

【讨论】:

  • 很好......不过,我认为char* nl = strchr(...); if(nl) { *nl = 0; } 效率更高。
猜你喜欢
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多