[英]How to get the length of a string in c, if it has integers in it
我熟悉C中的sizeof
操作,但是當我將它用於字符串"1234abcd"
,它只返回4
,我假設它是最后4個字符。 那么我怎么能把它變成一個8號的字符串呢?
具體代碼如下:
FILE *in_file;
in_file = fopen(filename, "r");
if (in_file == NULL) {
printf("File does not exist\n");
return 1;
}
int val_to_inspect = 0;
fscanf(in_file, "%x", &val_to_inspect);
while (val_to_inspect != 0) {
printf("%x", val_to_inspect);
int length = sizeof val_to_inspect;
printf("%d", length);
同樣,從文件中讀取的字符串是"1234abcd"
,只是為了澄清。
這里有幾個問題:
sizeof
運算符返回對象的大小。 在這種情況下,它返回val_to_inspect
的大小,這是一個int
。 http://en.cppreference.com/w/cpp/language/sizeof
fscanf
從流中讀取並解釋它。 您只掃描整數(“%x”),而不是字符串。 http://en.cppreference.com/w/cpp/io/c/fscanf
最后,如果你實際上有一個以nil結尾的字符串,要獲得它的長度,你可以使用strlen()
。
TL; DR ,要獲取字符串的長度 ,需要使用strlen()
。
也就是說,在使用sizeof
要小心謹慎,它會對數據類型進行操作。 因此,如果您將指針傳遞給它,它將返回指針變量的大小,而不是它指向的字符串的長度。
在幾個重要的方面,只有一些與sizeof
,你錯了你的代碼實際上做了什么。
FILE *in_file;
in_file = fopen(filename, "r");
if (in_file == NULL)
{
printf("File does not exist\n");
return 1;
}
實際上檢查fopen
是否成功的榮譽; 當很多人在C開始時忘了這么做。但是, fopen
失敗的原因有很多; 不存在的文件只是其中之一。 每當I / O操作失敗時,請確保打印strerror(errno)
以便了解實際原因。 此外,錯誤消息應發送到stderr
,而不是stdout
,並且應包括受影響文件的名稱(如果有)。 修正后的代碼看起來像
if (in_file == NULL)
{
fprintf(stderr, "Error opening %s: %s\n", filename, strerror(errno));
return 1;
}
(如果文件頂部不存在,則需要將string.h
和errno.h
包含添加到文件的頂部。)
int val_to_inspect = 0;
fscanf(in_file,"%x", &val_to_inspect);
此代碼不會從文件中讀取一個字符串。 它會跳過任何前導空格,然后從文件中讀取一系列十六進制數字,一旦遇到非數字就立即停止,並立即將它們轉換為存儲在val_to_expect
的機器編號。 對於包含1234abcd
的文件,它確實會從文件中讀取8個字符,但是對於其他文件內容,它可能會讀取更多或更少的內容。
(從技術上講,使用%x
轉換說明符,您應該使用unsigned int,但是大多數實現都可以讓您使用signed int。)
(當你在C中練習更多時,你將會發現scanf
按指定的方式被破壞,並且很難強有力地使用,但是現在不用擔心。)
while (val_to_inspect != 0) {
printf("%x", val_to_inspect);
int length = sizeof val_to_inspect;
printf("%d", length);
}
您沒有將sizeof
應用於字符串,而是將其應用於int
。 在您的計算機上, int
的大小為4個char
, 無論值是多少都是如此。
此外, sizeof
應用於實際C字符串(即,一個char *
變量指向字符的NUL封端的序列) 不計算串的長度。 它會告訴你指向字符串的指針的大小,它將是一個常量(通常是4或8,取決於計算機),與字符串的長度無關。 要計算字符串的長度,請使用庫函數strlen
(在string.h
聲明)。
您有時會看到聰明的代碼將sizeof
應用於字符串文字 ,它確實返回與其長度相關的數字(但不等於!)。 為你練習:找出這個數字是什么,以及為什么sizeof
為字符串文字做這個,而不是為一般的字符串做。 (提示:當s
被聲明為char s[] = "string";
, sizeof s
將返回與s
的字符串長度相關的數字,但是當它被聲明為char *s = "string";
時則不返回 char *s = "string";
。)
最后要注意的是,無論你是否喜歡自己的開口大括號,在整個方案中都無關緊要,但在整個文件中選擇一種風格並堅持下去 。 if
在自己的線上打開支架而在if
線的末端打開其他支架,請不要放置一些。
最好通過逐個字符來創建自己的計數器來查找"1234abcd"
的長度。
FILE *in_file;
char ch;
int length=0;
in_file = fopen("filename.txt", "r");
if (in_file == NULL)
{
printf("File does not exist\n");
return 1;
}
while (1) {
ch = fgetc(in_file);
printf("%c", ch);
if (ch == EOF)
break;
length++;
}
fclose(in_file);
printf ("\n%d",length);
大家好,謝謝你的反饋。 我意識到我在原帖中犯了很多錯誤,但是我只是從c ++切換到c,所以很多我以前習慣的東西都不能用同樣的方法。 這一切都非常有用,有一個地方可以去。
Len = sizeof(你的字符串)/ sizeof(char)-1 -1是eof字符null如果你想從特定的開始索引得到任何長度,那就做Len-index
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.