printf ("% s") не работает должным образом - PullRequest
1 голос
/ 10 марта 2012

Так что у меня есть этот большой код (так что я не смогу поместить всю вещь здесь) Но в какой-то момент у меня есть это.

while(ptr1!=NULL)
{
printf("%sab ",ptr1->name);
puts(ptr1->name);
ptr1=ptr1->next;
}

Теперь мой ptr1 указывает на запись массива структуры (каждая запись представляет собой связанный список), и структура заполняется из файла.

Теперь в этом цикле он печатает

FIRSTab FIRST
SECONDab SECOND
THIRD

Теперь, почему мои третьи не печатаются дважды?

Также, если я сделаю

printf(" %s",ptr1->name); // i.e. one space before %s

Я получаю

THIRDD

Если поставить 2 пробела до% s, я получу

THIRDRD

3 пробела дает

THIRDIRD

и т. Д.

Также, если я попытаюсь сделать strcmp (ptr1-> name, «THIRD»), я не получу правильное сравнение для THIRD. Почему ??

Вот как я заполнил свою структуру.

// G is the structure, fp is passed as argument to function.
//THe file format is like this.
//FIRST SECOND THIRD
//NINE ELEVEN 
//FOUR FIVE SIX SEVEN
// and so on.
int i=0,j=0,k=0;
char string[100];
while(!feof(fp))
{
if(fgets(string,100,fp))
{
G[i].index=i;
k=0;j=0;
//\\printf("%d",i);
//puts(string);
node *new=(node*)malloc(sizeof(node));
new->next=NULL;
G[i].ptr=new;
node* pointer;
pointer=G[i].ptr;
while(string[j]!='\n')
{
    if(string[j]==' ')
    {
    pointer->name[k]='\0';

    k=0;
        node *new=(node*)malloc(sizeof(node));
        new->next=NULL;
        pointer->next=new;
        pointer=pointer->next;
        j++;
    }
    else
    {   
    pointer->name[k++]=string[j]; 
    j++; 
    }
}
pointer->name[k]='\0';
i++;
}

1 Ответ

3 голосов
/ 10 марта 2012

Ваша третья строка, вероятно, содержит символы THIRD, за которыми следует \r (возврат каретки).Почему он содержит это, можно определить, только зная содержимое файла и то, как вы его читаете.

Вероятно, вы работаете в системе, в которой в качестве ограничителя строки используется один символ новой строки (нофайл, который вы открываете, поступает из системы, в которой используется пара возврата каретки и новой строки) или что указатель файла, который вы передали (fp), был открыт в двоичном режиме.

Если вы не можете изменитьуказатель файла должен быть открыт в текстовом режиме, тогда быстрое исправление может изменить это условие while(string[j]!='\n') на while(string[j]!='\n' && string[j] != '\r'), хотя вам может потребоваться более надежное решение, которое обрабатывает несколько пробельных символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...