隐式转换失去整数精度

时间:2016-02-15 16:12:04

标签: c compiler-errors

我收到的错误是“隐式转换失去了整数精度”任何关于它为什么会在线上发生的建议

    maxLen = strlen(line);

以下是代码:

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

    // Accepts: command line input
    // Returns: 0 if no error

    int main(int argc, char *argv[] )
    {
        int x = 0, i, lCount = 0, maxLen = 0;
        char line[500], *temp;

        FILE *file = fopen("playlist.txt", "r" );

        //  check if file exists
        if (file == NULL){
            printf("Cannot open file\n");
            return 1;
        }

        /* The following code identifies each line in the text and lines are shuffled accordingly */

        while (fgets(line, sizeof(line), file) != NULL)
        {
            lCount++;
            if (strlen(line) > maxLen)
                maxLen = strlen(line);
        }

        rewind(file);
        char *lArray[lCount];

        while (fgets(line, sizeof(line), file) != NULL)
        {
            lArray[x] = malloc(strlen(line));

            if (lArray[x] == NULL){
                printf("A memory error occurred.\n");
                return(1);
            }

            strcpy(lArray[x], line);

            /* change \n to \0 */
            lArray[x][strlen(lArray[x])-1] = '\0';
            x++;
        }

        printf("Your playlist %s has %d lines with %d characters\n", argv[1], lCount, maxLen);

        printf("The original inputted array is:\n");

        for (x = 0; x < lCount; x++)
            printf("%2d %s\n", x, lArray[x]);
        /*  The array will now be shuffled: */

        srand( (unsigned int) time(NULL));

        for (x = lCount - 1; x >= 0; x--){
            i = (int) rand() % lCount;
            temp = lArray[x];
            lArray[x] = lArray[i];
            lArray[i] = temp;
        }

        printf("\nShuffled Array\n");

        for (x = 0; x < lCount; x++)
            printf("%2d %s\n", x, lArray[x]);

        /* Memory will now be freed */
          /* for (x = 0; x < lCount; x++)
            free(lArray[x]);
        strdup(lArray);
        fclose(file); */
        return 0;
    }

2 个答案:

答案 0 :(得分:1)

strlen()返回size_t,这是一个无符号整数。

有关详细信息,请参阅:https://stackoverflow.com/a/22184543/248756

答案 1 :(得分:1)

size_tint代表不同的范围。

size_tsizeof运算符的结果类型,可以表示数组的任何索引。 int可能没有该范围,或者很少,它可能会过度编码该范围。 strlen()返回size_t,这是最好的类型,不能过分宽泛,足以代表所有法律结果。它是无符号整数类型。 (不一定是unsigned类型。)

因此,如果SIZE_MAX > INT_MAX显示在OP的平台上,则从size_t转换为int时可能会丢失一些丢失的信息 - 因此会出现警告。

#include <string.h>
// size_t strlen(const char *s);

int maxLen;
maxLen = strlen(line);  // warning

最好使用

size_t maxLen = strlen(line);
...
//                           note prefix ---v
printf("Your playlist %s has %d lines with %zu characters\n",
   argv[1], lCount, maxLen);

BTW你至少还有2个问题

       // insufficient space 
       // lArray[x] = malloc(strlen(line));
       lArray[x] = malloc(strlen(line) + 1);
       ...
       strcpy(lArray[x], line);

       // Following is a hacker's delight as strlen(lArray[x]) may return 0
       /* change \n to \0 */
       // lArray[x][strlen(lArray[x])-1] = '\0';

       // Instead simplest to lop \n from `line`
       while (fgets(line, sizeof(line), file) != NULL) {
         line[strcspn(line, "\n")] = '\0';