0

ansiCの文字列に単純な関数トリムスペースを書き込もうとしています。

私のstr_utis.h:

#include <string.h>

const char* trim_str(char *input_str); 

私のstr_utils.c:

const char* trim_str(char* input_str){
    char* str = NULL;
    int len = strlen(input_str);
    int i = 0;
    for (i = 0; i < len - 1; i++){
        if (input_str[i] == ' ')
            ;
        else
            str += input_str[i];
    }
    return str;
}

実行しようとすると、segfaultが発生します。

int main(int argc, char** argv) {
    const char* a = trim_str("Hey this is string");
    printf("%s", a);
    return 0;
}

なぜそれが間違っているのですか?どうすれば正しく書くことができますか?

ありがとうございました。

4

6 に答える 6

4

文字列リテラルは変更できません。UBです。文字列をコピーして、その内容を変更します。変化する

char* str = NULL;
int len = strlen(input_str);

size_t len = strlen( input_str );
char *str = malloc( len + 1 );

次に、空白以外の内容をコピーします。

于 2012-05-23T10:09:12.650 に答える
2

strは割り当てられておらず、+=を使用して文字列に追加することはできません。strncatを読んでください。

于 2012-05-23T10:09:05.530 に答える
1

これを通過します。これにより、入力文字列の両端から空白とタブが削除されます。

const char* trim_str(char* input_str){
    char* str = NULL;
    int len = strlen(input_str);
    str = (char *)malloc(len+1);
    int i = 0;
    while(i < len && (input_str[i]==' ' || input_str[i]=='\t')){
        ++i;
    }
    int j = 0;
    while(i< len && input_str[i]!=' ' && input_str[i]!='\t'){
      str[j]= input_str[i];
      ++j;
      ++i;
    }
   str[j] = '\0';

   return str;
  }
于 2012-05-23T10:24:13.527 に答える
1

これはかなり安全な方法です。

void rtrim(char instrng[]) {
assert (instrng != NULL);
if (strlen(instrng) == 0) {
    return;
}
while (instrng[strlen(instrng)-1] == '\n' || instrng[strlen(instrng)-1] == ' ' ) {
    instrng[strlen(instrng)-1] = '\0';
}
return; 
}
于 2012-05-24T03:09:24.810 に答える
1
char *trimdupstr(char *str)
{
size_t len, src,dst;
char *new;

if (!str) return NULL;
len = strlen (str);
new = malloc(len+1);
if (!new) return NULL;

for(src=dst=0; new[dst] = str[src++];   ) {
        if (new[dst] != ' ') dst++;
        }
return new;
}

また、これはタブと CR/LF も削除します。

char *trimdupstr(char *str)
{
size_t len, src,dst;
char *new;

if (!str) return NULL;
len = strlen (str);
new = malloc(len+1);

for (src=dst=0; str[src]; dst += len) {
        len = strspn(str+src, "\t \r\n" );
        src += len;
        len = strcspn(str+src, "\t \r\n" );
        memcpy (new+dst, str+src, len);
        src += len;
        }
new[dst] = 0;
return new;
}
于 2012-05-23T10:30:58.750 に答える
1

まず最初に、スペースを含まない新しい文字列サイズを取得する必要があります。必要がなければ、大きな文字列を割り当てたくありません。

   const char* trim_str(char* input_str){
        char* str = NULL;
        int len = strlen(input_str);
        int i = 0;
        int newSize = 0; 
        for (i = 0; i < len - 1; i++){
            if (input_str[i] == ' ')
                ;
            else
                newSize++;
        }
        str = malloc( newSize+ 1 );
        str[newSize] = '\0'

        // put the code of the copy bytes here...

        return str;
    }
于 2012-05-23T10:25:22.813 に答える