打印出额外的数字? (C)

时间:2015-10-16 15:25:04

标签: c printf atoi

您好我现在正在编写一个从文件中读取值的程序。

它通过fgets将值读入字符串 然后我想将其中一个字符串更改为整数:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#define FILSIZE 1024


typedef struct _node
{
unsigned int uid;
char *uname;
struct _node *next;
} *node;



int main(int argc, char* argv[])
{
FILE *pFile; // pointer file
char currentLine[FILSIZE];
bool isListEmpty = true;
node firstNode = NULL;

printf( "\n\nargc: %d\nargv[0]: %s\nargv[1]: %s\n\n", argc, argv[0], argv[1] );


if(argc == 1)
    {
    pFile = stdin;
    }


else if (argc == 2)
    {

    char buffer [50];       
    sprintf(buffer, "%s.txt" ,argv[1]);
    printf("%s", buffer);
    pFile = fopen(buffer, "r");

    }

    if(pFile == NULL )
    {
       printf("Not working");


  exit(0);
    }

int i=1;
int nameCounter = 1;
int colonCounter=0;


 while(!feof( pFile ) && fgets(currentLine, sizeof(currentLine), pFile))
    {



unsigned int nameLength;
unsigned int tempuid;   
unsigned int idstorlek;
node firstNode = malloc(sizeof(struct _node));

char *temporaryString;
    temporaryString = strtok(currentLine, ":");
colonCounter=colonCounter+1;

//printf(" fungera pls");
printf(" %d Namnordning %s \n", nameCounter, temporaryString);

nameLength = strlen(temporaryString);
firstNode->uname = malloc((nameLength+1) * sizeof(char));   
strcpy(firstNode->uname, temporaryString);




printf("NAMNET: %s \n", temporaryString);


while(temporaryString != NULL)
    {
    printf(" %s \n", temporaryString);

    if(colonCounter == 3)
        {

        int tempuid=atoi(temporaryString);
        // idstorlek = sizeof(tempuid);
         // firstNode->uid = malloc(4);
        printf(" IDN: %d \n", tempuid);             
        firstNode->uid = tempuid;
        printf("firstNodeid %d", firstNode->uid);
        }

    temporaryString = strtok(NULL, ":");        
    colonCounter=colonCounter+1;
    }

    if(colonCounter == 6)
    {

    // printf("FUNGERAR ID: %d NAMN %s \n", tempuid, firstNode->uname);

    }
    printf("%d Row is done \n", i);
    i=i+1;
    nameCounter = nameCounter+1;
    colonCounter = 0;



}



}           

但是当我把它写出来时,我得到了:

1 Namnordning mr 
NAMNET: mr 
 mr 
 x 
 1171 
 IDN: 1171 
firstNodeid 1171 1101 
 Mikael R�nnar 
 /Home/staff/mr 
 /usr/local/bin/tcsh

1 Row is done 
 2 Namnordning axelsson 
NAMNET: axelsson 
 axelsson 
 x 
 12856 
 IDN: 12856 
firstNodeid 12856 1101 
 Bj�rn Axelsson 
 /Home/staff/axelsson 
 /usr/local/bin/tcsh

2 Row is done 
 3 Namnordning gabriel 
NAMNET: gabriel 
 gabriel 
 x 
 16928 
 IDN: 16928 
firstNodeid 16928 1101 
 Gabriel Jonsson 
 /Home/staff/gabriel 
 /usr/local/bin/tcsh

3 Row is done  
 4 Namnordning set 
NAMNET: set 
 set 
 x 
 12037 
 IDN: 12037 
firstNodeid 12037 1101 
 Set Norman 
 /Home/staff/set 
 /usr/local/bin/tcsh

4 Row is done 
 5 Namnordning dahlin 
NAMNET: dahlin 
 dahlin 
 x 
 12928 
 IDN: 12928 
firstNodeid 12928 1101 
 Fredrik Dahlin 
 /Home/staff/dahlin 
 /usr/local/bin/tcsh

5 Row is done 
 6 Namnordning fahlgren 
NAMNET: fahlgren 
 fahlgren 
 x 
 17847 
 IDN: 17847 
firstNodeid 17847 1101 
 Daniel Fahlgren 
 /Home/staff/fahlgren 
 /usr/local/bin/tcsh 
6 Row is done  

为什么我也有1101? 另一个tempuid部分只给我正确的id。 我没有找到正确的记忆吗? (我一直在尝试,它只会给我带来奇怪的错误,使用idsize部分)。

2 个答案:

答案 0 :(得分:0)

通常你应该发布一个小的,完整的例子来证明这种行为(你经常会在这样做的时候自己发现这个bug)。

但事实证明,您已发布足够的信息以提供一个非常明确的指标:您的代码打印出额外的数字。相反,它只是无法打印换行符;输出的下一段代码将开始在同一行写入。

答案 1 :(得分:0)

这是因为你打电话后没有刷新打印缓冲区

printf("firstNodeid %d", firstNode->uid);

printf存储一个字符缓冲区,而不是一旦到达它就将字符串写入stdout,以避免过于频繁地调用低级write函数的开销。

而是致电:

printf("firstNodeid %d\n", firstNode->uid);

应该解决您的问题,因为"\n"会在字符串中添加换行符,并刷新输出。

编辑:您还应该注意类型。您将tempuid定义为int

int tempuid=atoi(temporaryString);
// idstorlek = sizeof(tempuid);
// firstNode->uid = malloc(4);
printf(" IDN: %d \n", tempuid);             
firstNode->uid = tempuid;
printf("firstNodeid %d", firstNode->uid);

但是在节点结构中将其定义为unsigned int