0

渡された C スタイルの文字列 (つまり、char *) を反転し、反転された文字列の char ポインターを返す C 関数を作成しようとしています。しかし、これを VS2012 で実行すると、ターミナルに何も出力されず、「main.exe が動作を停止しました」というメッセージが表示されます。

#include <stdio.h>
#include <string.h>
char * rrev_str(char * str )
{
    char *revd_str=""; //I tried char revd_str []="" error: stack around "revd_str" is corrupted
    int i,r;
    int str_len=strlen(str);
    for (i = str_len-1, r=0; i >=0; i--,r++)
    {
        revd_str[r]= str[i];
    }
    return revd_str;
}

int main(int argc, char* argv[])
{
   char str1 [] ="STEETS";
   char str2 [] ="smile everyday!";

   //reverse "chars" in a C string and return it
   char * rev_string=rrev_str(str1);
}
4

3 に答える 3

2

ここでの問題は 3 倍です。1 つ目は、逆文字列に十分なスペースを割り当てていないこと、2 つ目は rrev_str() でローカル変数へのポインターを返していること、3 つ目は文字列リテラルを変更していることです。ヒープに revd_str 用のスペースを割り当てる必要があります。

char * rrev_str(char * str )
{   
    int i,r;
    int str_len=strlen(str);

    char *revd_str=malloc(str_len + 1); 
    memset(revd_str, 0, str_len + 1);

    for (i = str_len-1, r=0; i >=0; i--,r++)
    {
        revd_str[r]= str[i];
    }
    return revd_str;
}
于 2013-05-17T18:01:53.930 に答える
0

何!あなたがやっている..

char *revd_str=""; // Creating String Literal which can't be modified because they are read only  
char *revd_str[]=""; // Creating Char Array of Size Zero.

だから解決策は

あなたの文字列を参照してください

char *revd_str = strdup(str);

または、動的文字配列を作成します

char *revd_str = (char*) malloc (strlen(str)+1);  

あなたのプログラムは正常に動作します。リバースのロジックが正しくないため、修正してください。サンプル ソリューションを以下に示します。

char * rrev_str(char * str )
{
    char *revd_str=strdup(str);
    int i;  // no need for extra 'int r'
    int str_len=strlen(str);
    for (i = 0; i < str_len/2; i++)
    {
        char temp = revd_str[i];
        revd_str[i]= revd_str[str_len - 1 -i];
        revd_str[str_len - 1 -i] = temp;
    }
    return revd_str;
} 
于 2014-01-13T06:03:07.887 に答える