使用 fgets() 后查找字符串长度
Finding string length after using fgets()
我试图找到字符串 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) = '[=10=]';
*(s2 + strlen(s2) - 1) = '[=10=]';
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;
}
在使用 fgets
或 getline
从文件读取后,有一种相当标准的方法来处理从输入中剥离换行符。有变体,但都用空终止字符替换换行符。这是使用您的代码的示例:
#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
我试图找到字符串 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) = '[=10=]';
*(s2 + strlen(s2) - 1) = '[=10=]';
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;
}
在使用 fgets
或 getline
从文件读取后,有一种相当标准的方法来处理从输入中剥离换行符。有变体,但都用空终止字符替换换行符。这是使用您的代码的示例:
#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