簡體   English   中英

如果在c中有一個整數,如何在c中獲取字符串的長度

[英]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.herrno.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM