Fget在读完一个字符串后自动\ n

时间:2015-12-08 20:24:26

标签: c pointers fgets

我有一个非常奇怪的问题。在使用fgets读取/键入字符串指针后,下次我想从键盘读取新字符串时,第一个字符自动变为\ n。我该如何避免/覆盖? 我试过用

if (firstString[strlen(firstString) - 1] == '\n')
        firstString[strlen(firstString) - 1 ] = 0;

但它仍无法正常工作。 感谢帮助。 这是我的代码:

void citire_text (char *text , int numar_linii)
 {
    char *text_linie;
    int i;

    for(i=0;i<=numar_linii;i++)
    {
        char *text_linie;
        text_linie = malloc(MAX*sizeof(char));
        fgets(text_linie,MAX,stdin);
        strcat(text,text_linie);

    }
    if (text[strlen(text) - 1] == '\n')
        text[strlen(text) - 1 ] = 0;

}   

void citire_operatie (char *operatie) 
{

    fgets(operatie,MAX+2,stdin);
    printf("%d",*operatie);
    if ((*operatie)=='\n')
        printf("YES");
    else

        printf("NO\n");




}
int main(void) 
{
    char *text,*operatii;
    int numarDeLinii,i;
    scanf("%d",&numarDeLinii);
    text = malloc(MAX*numarDeLinii*sizeof(char));
    operatii = malloc((MAX+2)*sizeof(char)); 
    citire_text(text,numarDeLinii);
    int numar_operatii;
    scanf("%d",&numar_operatii);    
    for(i = 1;i<= numar_operatii;i++)
        citire_operatie(operatii);
    return 0;
}

如果我设置&#34; numar_operatii&#34;为了1,在子程序citire_operatie fgets甚至不会被称为。

1 个答案:

答案 0 :(得分:1)

最好不要将scanf()函数与fgets()混合使用。代码读取'\n'

时会遗留scanf("%d", ...个遗留问题

而不是

 scanf("%d",&numarDeLinii);

使用fgets()

阅读
char buf[80];
if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOF();
if (sscanf(buf, scanf("%d",&numarDeLinii) != 1) Handle_Nonnumeric_Input();

或者创建一个简单的辅助函数来读取int。类似的东西:

int Read_int(FILE *istream, const char * prompt, int *dest)  {
  char buf[80];
  while (fgets(buffer, sizeof buffer, stdin)) {
    fputs(prompt, stdout);
    fflush(stdout);
    if (sscanf(buffer, "%d", dest) == 1) return 1;
  }
  return EOF;
}

// Usage
if (Read_int(stdin, "Enter lines", &numarDeLinii) != 1) return FAIL;
if (Read_int(stdin, "Enter operations", &numar_operatii) != 1) return FAIL;