gpt4 book ai didi

c - 我的c代码有什么问题? (可能是 malloc 调用)

转载 作者:行者123 更新时间:2023-11-30 21:24:28 25 4
gpt4 key购买 nike

关闭。这个问题需要debugging details .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

5年前关闭。




Improve this question




当我运行这段代码时,我得到一个段错误。我确定我做错了指针,但我不确定为什么或如何解决它。
我还包括了我试图以图片形式回答的问题。
question

#include <stdio.h>
#include <stdlib.h>

char * repeat_characters(char *s, int n) {
printf("%s", *s);

char temp;
int length = 0;
int i = 0;
int j = 0;
int k = 0;
char * newString;

while(s[length]) {
length++;
printf("%d", length);
} // finds length of string

newString = (char*) malloc(length*n*sizeof(char));

while(i++ < i*n) {
temp = s[i];
while (j++ < n) {
newString[k] = temp;
printf("%c", temp);
k++;
}
}
printf("%s", newString);
return newString;
}

int main () {
char * string[100];
int numReps = 0;

printf("Enter a string: ");
scanf("%s", string);

printf("\nEnter number of repetitions: ");
scanf("%d", &numReps);

repeat_characters(*string, numReps);
return 0;
}

最佳答案

作为提问者,你的工作之一是 shorten your program to the minimum这说明了一个问题。例如,以下将给出段错误:

#include <stdio.h>

char * repeat_characters(char *s, int n) {
printf("%s", *s);
return NULL;
}

int main () {
char * string[100];
scanf("%s", string);

repeat_characters(*string, 0);
return 0;
}

编译器警告可以指出很多问题。所以打开这些警告。如果您使用 gcc,请尝试 gcc -Wall -Wextra -Werror main.c (或查看编译器的文档。)

( -Werror 会将警告变成错误,并防止您意外忽略警告,我认为这对学习者和专家来说都是一个好习惯。)

   printf("%s", *s);

format '%s' expects argument of type 'char*', but argument 2 has type 'int'



这里有一个参数 char *s .根据上下文,可以是指向单个字符的指针,也可以是指向多字符序列的第一个字符的指针。

C 字符串的操作约定是它是一个多字符序列,并且字符范围最终由 '\0' 终止。 (或 0 值字符)。所以当你调用 printf您必须确保您传入的字符指针指向这样一个有效格式的序列。

您正在传递 *s ,它取消引用指向字符的指针以使其成为单个字符。如果要打印单个字符,则需要使用 %c ,例如 printf("%c", *s); .但是你想打印一个 C 字符串,所以你应该放弃取消引用 *就说 printf("%s\n", s) . (您可能希望 \n 输出换行符,否则您的打印将全部一起运行。)

(注意:没有警告的原因 C 在传递预期字符指针的字符时没有提示是由于 printfscanf 等函数的“怪异”。它们没有固定数字或他们采用的参数类型,因此检查较少......警告有助于弥补不足。)

   scanf("%s", string);

format '%s' expects argument of type 'char*', but argument 2 has type 'char**'



在这里,您遇到了将 s 声明为 char * string[100]; 的问题。 ,它是一个字符指针数组,而不是一个字符数组。 C 数组的对偶性能够像指向其第一个元素的指针一样需要一些时间来适应,但如果你说 char string [100];然后 string[0]charstring可以“衰减”到 char*&string[0] 同义:

Is an array name a pointer?

   while(i++ < i*n)

operation on 'i' may be undefined



编译器在这里提出技术投诉,关于修改变量 i在同样使用 i 的表达式中.警告 i 是否在 i*n会在增量之前或之后看到值。避免这种表达方式...以及何时何地您关心您可以这样做和不能这样做的时候,请阅读 sequence points .

但把它放在一边。你来这里的目的是什么?了解 ++ 的细微差别摆脱它...怎么样 while (i < i * n) ?什么时候会是假的?为什么它与解决问题有关?

查看您的代码,也许尝试更多地评论它。什么是“不变量”,或者您可以对每行都为真的变量声明哪些内容?如果你被要求为代码工作的原因辩护——没有编译器来运行它来查看——什么会让你确信它做了正确的事情?

然后使用调试器和示例逐步完成它,并检查您的直觉。如果你越过一条线并且没有得到你所期望的,那么可能是时候开始考虑一个问题来提出哪些问题来吸引注意力到这条线。

评论中还提出了其他问题(例如,您的 malloc() 不包括终止符的空间,即使您为该空间添加 1,您仍然必须在其中写入 '\0'...) .一般来说,您的程序应该执行尽可能多的 free()就像它一样 malloc() s。等等。但希望这能为您指明正确的任务方向。

关于c - 我的c代码有什么问题? (可能是 malloc 调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36488107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com