Printf()不按顺序打印字符串参数

时间:2015-10-16 20:17:33

标签: c printf

我有一些C代码逐行读入文本文件,散列每行中的字符串,并保持具有最大散列值的字符串的运行计数。

似乎做了正确的事情,但是当我发出print语句时:

 printf("Found Bigger Hash:%s\tSize:%d\n", textFile.biggestHash, textFile.maxASCIIHash);    

我的print在输出中返回:

预处理:dict1
找到BiSize:110h:a 发现BiSize:857h:aardvark
发现BiSize:861h:aardwolf
发现BiSize:937h:被遗弃的 发现BiSize:951h:放弃者 发现BiSize:1172:放弃了 发现BiSize:1283:缩写
发现BiSize:1364:abiogenetical
发现BiSize:1593:abiogenetically
发现BiSize:1716:心不在焉 发现BiSize:1726:acanthopterygian
发现BiSize:1826:适应性
发现BiSize:1932:adenocarcinomatous
发现BiSize:2162:肾上腺皮质激素 发现BiSize:2173:化学自养 发现BiSize:2224:反革命
发现BiSize:2228:反革命主义者 实测BiSize:2258:dendrochronologically
发现BiSize:2440:脑电图 实测BiSize:4893:pneumonoultramicroscopicsilicovolcanoconiosis
最大尺寸:46umonoult总字数:71885covolcanoconiosis

所以我似乎误用了printf()。以下是代码:

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

#define WORD_LENGTH 100 // Max number of characters per word

// data1 struct carries information about the dictionary file; preprocess() initializes it
struct data1
{
   int numRows; 
   int maxWordSize; 
   char* biggestWord;
   int maxASCIIHash; 
   char* biggestHash;  
}; 

int asciiHash(char* wordToHash); 
struct data1 preprocess(char* fileName); 


int main(int argc, char* argv[]){

   //Diagnostics Purposes; Not used for algorithm  
   printf("Preprocessing: %s\n",argv[1]); 
   struct data1 file = preprocess(argv[1]); 
   printf("Biggest Word:%s\t Size:%d\tTotal Words:%d\n", file.biggestWord, file.maxWordSize, file.numRows);  
   //printf("Biggest hashed word (by ASCII sum):%s\tSize: %d\n", file.biggestHash, file.maxASCIIHash);  
   //printf("**%s**", file.biggestHash); 
   return 0; 
}

int asciiHash(char* word)
{
   int runningSum = 0; 
   int i;
   for(i=0; i<strlen(word); i++)
   {
      runningSum += *(word+i); 
   }
   return runningSum; 
}

struct data1 preprocess(char* fName)
{
   static struct data1 textFile = {.numRows = 0, .maxWordSize = 0, .maxASCIIHash = 0};
   textFile.biggestWord = (char*) malloc(WORD_LENGTH*sizeof(char));    
   textFile.biggestHash = (char*) malloc(WORD_LENGTH*sizeof(char));  
   char* str = (char*) malloc(WORD_LENGTH*sizeof(char)); 

   FILE* fp = fopen(fName, "r"); 
   while( strtok(fgets(str, WORD_LENGTH, fp), "\n") != NULL)
   {
      // If found a larger hash
      int hashed = asciiHash(str);
      if(hashed > textFile.maxASCIIHash)
      { 
         textFile.maxASCIIHash = hashed;  // Update max hash size found
         strcpy(textFile.biggestHash, str); // Update biggest hash string
         printf("Found Bigger Hash:%s\tSize:%d\n", textFile.biggestHash, textFile.maxASCIIHash);   
      }
      // If found a larger word
      if( strlen(str) > textFile.maxWordSize)
      {
         textFile.maxWordSize = strlen(str); // Update biggest word size
         strcpy(textFile.biggestWord, str); // Update biggest word 
      }
      textFile.numRows++; 
   }

   fclose(fp); 
   free(str); 
   return textFile; 
}

2 个答案:

答案 0 :(得分:1)

您的陈述

while( strtok(fgets(str, WORD_LENGTH, fp), "\n") != NULL)

未考虑fgets()strtok()工作方式的返回值。

这样做的方法就像

char *fptr, *sptr;
while ((fptr = fgets(str, WORD_LENGTH, fp)) != NULL) {
    sptr = strtok(fptr, "\n");
    while (sptr != NULL) {
        printf ("%s,", sptr);
        sptr = strtok (NULL, "\n");
    }
    printf("\n");
}

请注意,首次调用strtok()后,对同一序列的后续调用必须传递参数NULL

答案 1 :(得分:1)

您在阅读后忘记删除\r。这是在您的输入中,因为(1)您的源文件来自Windows机器(或至少一个使用\r\n行结尾),以及(2)您使用fopen模式{{1} },它不会在你的操作系统上翻译行结尾(再次,大概是Windows)。

这导致奇怪的输出如下:

"r"

- 查看Found Bigger Hash:text\r\tSize:123的位置?那么当输出这个字符串时会发生什么,你最初会得到

\r

然后通过Found Bigger Hash:text将光标重新定位到行的开头。接下来,输出一个标签 - 不是通过打印空格而是仅将光标移动到第8个位置:

\r

并将其余字符串打印在已显示的字符串上:

1234567↓
Found Bigger Hash:text

可能的解决方案:

  1. Found BiSize:123h:text“文字”模式和/或
  2. 打开您的文件
  3. 检查并删除"rt"代码以及\r
  4. 我会去找他们两个。 \n非常便宜,可以让您的代码更加简单。

    (另外,请通过将其分成几个不同的操作来简化您的strchr行。)