我的程序工作正常,但在编译时警告 -Wwritable-strings

My Program works fine, but while compiling it warns -Wwritable-strings

我的程序工作正常,但在编译时显示警告: “ISO C11 不允许从字符串文字转换为 'char *' [-Wwritable-strings] list.get_string("Enter a String: ");

代码如下:

char * getString(char *str)
{
    int ch, i;
    char *ptr = malloc(sizeof(int) * sizeof(char) + 1);
    i=0;
    printf("%s", str);
    while((ch=getchar())!='\n')
    {
        ptr[i] = ch;
        i++;
    }
    return ptr;
}

为什么它在我的代码中显示警告? 另外,代码看起来有点乱。有没有更好的方法来编写这段代码?

我用你在评论中更新的代码回答。

#include <stdlib.h>
#include <string.h>
char * get_string(const char *str) 
{ 
    int ch, i=0; 
    char *ptr2; 
    char *ptr = malloc( sizeof (char) * sizeof (int) + 1 ); 
    printf("%s", str); 
    while((ch = getchar()) != '\n') { 
        ptr[i]=ch; 
        i++; 

    } 
    strcpy(ptr2, ptr); 
    free(ptr); 
    return ptr2; 

} 
int main() { 
    char *str; 
    str = get_string("Enter a String: "); 
    printf("%s\n", str); 
    return 0; 

} 

你不需要使用ptr2你可以只使用ptr和return。但是,如果您仍然想使用 ptr2,则必须为其分配,因为您使用 strcpyptr 复制到 ptr2

char *ptr = malloc( sizeof (char) * sizeof (int) + 1 );

这条线太奇怪了。没有错,但是对于理解代码不是那么清楚。您可以定义字符串的 MAX_LEN,然后使用 malloc

例如:

#define MAX_LEN 256
char * get_string(const char *str) {
   ...
   char *ptr = malloc(MAX_LEN);
   ...
}

其他人在阅读您的代码时更容易理解。

你应该检查malloc的return,因为它可能会失败。

我提出的代码(解释在代码中):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 256

char * getString(const char * str) 
{
    printf("%s",str);
    char * str2 = malloc(MAX_LEN); // string length ups to 255
    if(!str2) {return NULL;} // check return of malloc function
    fgets(str2, MAX_LEN, stdin); // using fgets to get string from keyboard (from redirect file is another story)
    str2[strcspn ( str2, "\n" )] = '[=13=]'; // remove '\n' character
    return str2; 

} 
int main() { 
    char *str = getString("Enter a String: "); 
    if(!str) {
       printf("%s\n", str); 
       free(str); // free str (str2 that you allocated in getString function) to avoid memory leaks.
    }
    return 0; 

}