我收到的错误是“隐式转换失去了整数精度”任何关于它为什么会在线上发生的建议
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;
}
答案 0 :(得分:1)
strlen()
返回size_t
,这是一个无符号整数。
有关详细信息,请参阅:https://stackoverflow.com/a/22184543/248756
答案 1 :(得分:1)
size_t
和int
代表不同的范围。
size_t
,sizeof
运算符的结果类型,可以表示数组的任何索引。 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';