我正在尝试修改main(tab)中声明的char数组.所以我将它发送到modify_tab并修改它.但它不起作用并向我发送分段错误.这是我的代码:
1?void my_putstr(char *str)
2?{
3? int i;
4?
5? i = 0;
6? while (str[i] != '\0')
7? {
8? write(1, &str[i], 1);
9? i++;
10? }
11?}
12?
13?void modify_tab(char *tab)
14?{
15? char *map;
16?
17? map = tab;
18? map[3] = 'a';
19? my_putstr(map);
20?}
21?
22?void main()
23?{
24? char *tab;
25?
26? tab = "0123456789\n\0";
27? my_putstr(tab);
28? modify_tab(tab);
29?}
Run Code Online (Sandbox Code Playgroud) 可能重复:
修改C字符串常量?
使用malloc时char*str有什么区别?
int i;
char *s = (char*)malloc(sizeof(char)*27);
for(i=0;i<26;i++)
s[i]='a'+i;
s[26]='\0';
printf("%s\n",s);
reverse(s);
printf("%s\n",s);
Run Code Online (Sandbox Code Playgroud)
其中reverse()是
void reverse(char *str)
{
int i,j=strlen(str)-1;
char tmp;
for(i=0;i<j;i++,j--)
{
tmp=str[i];
str[i]=str[j];
str[j]=tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但使用时
char *t = "new string";
printf("%s\n",t);
reverse(t);
printf("%s\n",t);
Run Code Online (Sandbox Code Playgroud)
我得到一个段错误,调试器说它是反向的strlen.将char*t更改为char t []可以正常工作.是什么赋予了?
在第18行,我在第一次迭代(i = 0)中得到一个seg错误.
#include <stdio.h>
int main(void) {
char* str = "mono";
int length = 0;
int i;
for (i = 0; ; i++) {
if (str[i] == '\0') {
break;
} else {
length++;
}
}
for (i = 0; i < length / 2; i++) {
char temp = str[length - i - 1];
str[length - i - 1] = str[i]; // line 18
str[i] = temp;
}
printf("%s", str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我写这个算法来反转一个字符串.
我正在使用下面的代码在我的字符串中添加一些"0"字符,但似乎存在问题并且程序将崩溃.一切似乎都是逻辑但我不知道问题出在哪里?
#include <stdlib.h>
#include <string.h>
int main()
{
char *Ten; int i=0; Ten = malloc(12);
Ten="1";
for (i=0;i<10;i++)
strcat(Ten,"0");
printf("%s",Ten);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 字符串文字是左值,它打开门以修改字符串文字.
来自C in a Nutshell:
在C源代码中,文字是表示固定值的标记,可以是整数,浮点数,字符或字符串.文字的类型由其值和符号决定.这里讨论的文字不同于C99标准中引入的复合文字.复合文字是普通的可修改对象,类似于变量.
虽然 C不严格禁止修改字符串文字,但您不应尝试这样做.首先,编译器将字符串文字视为常量,可将其置于只读存储器中,在这种情况下,尝试的写操作会导致错误.另一方面,如果程序中使用了两个或多个相同的字符串文字,编译器可能会将它们存储在同一位置,因此当您访问另一个时,修改它会导致意外结果.
第一段说"C中的字面值表示固定值".
这是否意味着不应修改文字(复合文字除外)?
由于字符串文字不是复合文字,是否应修改字符串文字?
这两段是否相互矛盾?我怎么理解他们?
可以修改既不是复合文字也不是字符串文字的文字?
我无法找到这个问题的答案(如果是重复的话,我看起来很抱歉)。据我所知,在 C 中初始化 char 数组时大致有两种方法:
char[] a = "Hello";
char * b = "Hello";
Run Code Online (Sandbox Code Playgroud)
这些实现了相同的结果,但“b”的第二次初始化让我感到困惑。我理解“a”的初始化,因为它有点相当于*(char *a) = "Hello" 假设内存已分配等等...但是“b”初始化的语法在我看来就像“b”是一个指针,指向地址“Hello”当然没有任何意义,除非使用 ASCII 值。据我所知,对于整数或其他数据类型,没有与 'b 的初始化等效的东西。如果有人能提供解释那就太好了!我已经使用 C 很长一段时间了,这个问题总是让我有点困扰,我一直无法想到/找到答案
这是代码,它是C代码.并请说明="字符串"的返回值
char * p = (char*) malloc(sizeof(char) * 100);
p = "hello";
*(p+1) = '1';
printf("%s", p);
free(p);
Run Code Online (Sandbox Code Playgroud) 我是C的前任,所以请耐心等待我; 我知道我可以将数组语句作为*c或c[];
我的问题是关于memset:
char str[] = "hello!";
memset (str,'-',2);
puts (str);
Run Code Online (Sandbox Code Playgroud)
工作良好.但:
char *str = "hello!";
memset (str,'-',2);
puts (str);
Run Code Online (Sandbox Code Playgroud)
不工作,我知道char *str = ...是一个正常的数组语句.
如果有人可以帮我这个,我谢谢你!