我的程序工作正常,但在编译时警告 -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
,则必须为其分配,因为您使用 strcpy
将 ptr
复制到 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;
}
我的程序工作正常,但在编译时显示警告: “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
,则必须为其分配,因为您使用 strcpy
将 ptr
复制到 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;
}