【问题标题】:Finding string length after using fgets()使用 fgets() 后查找字符串长度
【发布时间】:2015-03-27 16:41:25
【问题描述】:

我正在尝试查找字符串 1(s1).. 的长度,但它给出的值为 0,并且输入 s1 = "HELLO",因为此错误无法执行我所在的 for 循环使用字符串 1 的长度。

以下是代码...在 gcc 版本 4.9.1 (Ubuntu 4.9.1-16ubuntu6) 中可以正常工作,但在在线编译器中不能正常工作(gcc 4.9.2,C99 标准)

/*To check if common characters are present in two strings*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio_ext.h>
#define SIZE 100
int main() {
int m, i, j, t, len1;
char *s1, *s2;
scanf("%d", &t);  //No. test cases
__fpurge(stdin);

for(m = 0; m < t; m++)
{
    int res = 0;

    s1 = (char *)malloc( SIZE * sizeof( char ));
    s2 = (char *)malloc( SIZE * sizeof( char ));

    fgets(s1, SIZE, stdin);
    fgets(s2, SIZE, stdin);

    *(s1 + strlen(s1) - 1) = '\0';
    *(s2 + strlen(s2) - 1) = '\0';

    len1 = strlen(s1); // len1 is storing as 0
    printf("%d", len1 ); 
    for (i = 0; i < strlen(s1); i++)  
    {
        for (j = 0;j < strlen(s2); j++)
        {
            if ( *(s1 + i) == *(s2 + j) )
            res = 1;
        }
    }

if(res == 1)
printf( "YES\n" );
else
printf("NO\n");
}
return 0; 
}

【问题讨论】:

  • 什么是 s1 定义后的转储?
  • SIZE 定义为什么?我希望不是5!! 5 不足以容纳"HELLO" ...您需要考虑'\0' 终止符以及换行符
  • 我将10 用作SIZE,您的代码对我有用...
  • @Jongware 为什么要定义这么奇怪的东西?使用像10 这样的数值来定义字节数或字符数。

标签: c fgets strlen


【解决方案1】:

在使用fgetsgetline 读取文件后,有一种相当标准的方法可以处理从输入中去除换行符。有一些变化,但都用空终止字符替换换行符。这是使用您的代码的示例:

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

#define SIZE 64

int main (void) {

    char *s1 = NULL;
    char *s2 = NULL;
    size_t len1 = 0;
    size_t len2 = 0;

    s1 = malloc (SIZE * sizeof *s1);
    s2 = malloc (SIZE * sizeof *s2);

    printf ("\n Enter s1: ");
    fgets (s1, SIZE, stdin);
    printf ("\n Enter s2: ");
    fgets (s2, SIZE, stdin);

    /* strip newline or carriage rtn    */
    len1 = strlen (s1);
    while (len1 > 0 && (s1[len1-1] == '\n' || s1[len1-1] == '\r'))
        s1[--len1] = 0;

    len2 = strlen (s2);
    while (len2 > 0 && (s2[len2-1] == '\n' || s2[len2-1] == '\r'))
        s2[--len2] = 0;

    printf ("\n  len1 : %zu   s1 : %s\n  len2 : %zu   s2 : %s\n\n", len1, s1, len2, s2);

    if (s1) free (s1);
    if (s2) free (s2);

    return 0;
}

输出

$ ./bin/fgets_strip

 Enter s1: This is s1

 Enter s2: This is s2

  len1 : 10   s1 : This is s1
  len2 : 10   s2 : This is s2

【讨论】:

  • 我假设您添加了\r 是为了与 Windows 兼容......但这有必要吗? A good reference 会说它存储“换行符”,当然这只是\n
  • 代码运行良好.. 学习了去除换行符或回车的新方法.. 谢谢! @大卫·C·兰金
  • 很高兴我能帮上忙……是的,回车是针对黑暗面的,或者是从闪存驱动器等复制的任何文件,这些文件仍然以 CRLF 结尾。
  • @LijuThomas:如果这令人满意地回答了您的问题,请单击复选标记。作为新的 SO 成员,您可能希望阅读介绍性 tour
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 2013-05-03
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多