28
#include <stdio.h>

int main ()
{
    char *ptr = "stackoverflow"

}

sizeof ptrは常に4を与えるので、ptrが指すstackoverflowの長さを見つける方法はありますか?

4

9 に答える 9

54

strlenを使用して、文字列の長さ(文字数)を検索します

const char *ptr = "stackoverflow";
size_t length = strlen(ptr);

もう1つのマイナーな点ptrは、文字列リテラル(変更できないconstメモリへのポインタ)であることに注意してください。これを示すためにconstとして宣言することをお勧めします。

于 2012-11-25T12:31:34.567 に答える
26
  1. sizeof()タイプに必要なサイズを返します。この場合、sizeofに渡す型はポインターであるため、ポインターのサイズを返します。

    ポインタが指すデータのサイズが必要な場合は、明示的に保存して覚えておく必要があります。

  2. sizeof()コンパイル時に機能します。したがって、通常はそうsizeof(ptr)なります。return 4 or 8 bytes代わりに。を使用してstrlenください。

于 2012-11-25T12:41:55.603 に答える
7

によって提供されるstrlen()関数はstring.h、引数が指す文字列に含まれる「実際の文字」の数を示します。ただし、この長さには終了ヌル文字は含まれません'\0'。メモリを割り当てるための長さが必要な場合は、それを考慮する必要があります。

その4バイトは、プラットフォーム上のcharへのポインターのサイズです。

于 2012-11-25T12:35:42.760 に答える
5
#include<stdio.h>
main()
{
    int mystrlen(char *);
    char str[100];
    char *p;
    p=str;
    printf("Enter the string..?\n");
    scanf("%s",p);
    int x=mystrlen(p);
    printf("Length of string is=%d\n",x);


}
int mystrlen(char *p)
{
    int c=0;
    while(*p!='\0')
    {
        c++;
        *p++;
    }
    return(c);
}

理解するための簡単なコード

于 2016-01-26T20:41:49.527 に答える
2

あなたはその機能を探していstrlen()ます。

于 2012-11-25T12:31:40.733 に答える
1

あなたは使用してみることができます:

char *ptr = "stackoverflow"
size_t len = strlen(ptr);
于 2012-11-25T12:33:16.340 に答える
1

ptrの長さが関数の引数である場合は、ポインタを文字列として使用するのが妥当です。次のコードで文字列の長さを取得できます。

char *ptr = "stackoverflow";
length=strlen((const char *)ptr);

さらに説明すると、stringが可変長のユーザーによる入力文字列である場合、次のコードを使用できます。

unsigned char *ptr;
ptr=(unsigned char *)calloc(50, sizeof(unsigned char));
scanf("%s",ptr );
length=strlen((const char *)ptr);
于 2014-01-04T07:32:37.277 に答える
1

純粋にポインタを使用すると、ポインタ演算を使用できます。

int strLen(char *s)
{
    int *p = s;
    while(*p !=’\0’)
    {
        p++;  /* increase the address until the end */
    }
    Return p – s; /* Subtract the two addresses, end - start */
}
于 2017-10-30T13:11:15.137 に答える
1

これは一般的なCの質問ですが、この質問をC ++で検索すると、かなり高いヒット数になります。私はC/C ++の領域にいるだけでなく、Microsoftのセキュリティ開発ライフサイクル(SDL)で禁止されている特定のプロジェクトの関数呼び出しに注意する必要がありましstrlenた。

匿名のインターネット接続を受け入れるような重要なアプリケーションについて strlen も、交換する必要があります...

とにかく、この回答は基本的に他の回答にひねりを加えたものですが、承認されたMicrosoft C ++の代替関数呼び出しと、C99の更新された制限である65,535バイトに関するワイド文字の処理に関する考慮事項があります。

#include <iostream>
#include <Windows.h>
int wmain()
{
    //  1 byte per char, 65535 byte limit per C99 updated standard
    //  https://stackoverflow.com/a/5351964/3543437
    const size_t ASCII_ARRAY_SAFE_SIZE_LIMIT = 65535; 

    //  Theoretical UTF-8 upper byte limit of 6; can typically use 16383 for 4 bytes per char instead:
    //  https://stijndewitt.com/2014/08/09/max-bytes-in-a-utf-8-char/
    const size_t UNICODE_ARRAY_SAFE_SIZE_LIMIT = 10922;

    char ascii_array[] = "ACSCII stuff like ABCD1234.";
    wchar_t unicode_array[] = L"Unicode stuff like → ∞ ∑ Σὲ γνωρίζω τὴν ደሀ ᚦᚫᛏ.";

    char * ascii_array_ptr = &ascii_array[0];
    wchar_t * unicode_array_ptr = &unicode_array[0];

    std::cout << "The string length of the char array is: " << strnlen_s(ascii_array_ptr, ASCII_ARRAY_SAFE_SIZE_LIMIT) << std::endl;
    std::wcout << L"The string length of the wchar_t array is: " << wcsnlen_s(unicode_array_ptr, UNICODE_ARRAY_SAFE_SIZE_LIMIT) << std::endl;

    return 0;
}

出力:

The string length of the char array is: 27
The string length of the wchar_t array is: 47
于 2018-10-03T02:46:03.030 に答える