我特灵着让这个程序工作,但在给了它很多转,我决定是时候问。无论我做什么,结果总是一个分段错误,我非常确定这是针对strcmp的。你能帮帮我吗?
#include <stdio.h>
#include <string.h>
void main ()
{
char *marcas[7] = {"Alfa Romeo", "Fiat", "Ford", "Lancia", "Renaudl", '\0', '\0'};
char *marca, *aux;
int i;
int cont=5;
marca=" ";
aux=" ";
for(i=0;i<cont;i++)
printf("%s\n",marcas[i]);
while (cont<7){
printf("Ingrese la marca que desee agregar a la lista.\n");
scanf("%s",marca);
printf("Gracias. Ud. quiere agregar la marca: %s.\n", marca);
i=0;
while(strcmp(marcas[i], marca)<0 && i<cont){
i++;
printf("Moviendo puntero.\n");
}
printf("Termine de mover.\n");
if (i < cont){
while (i<cont){
strcpy(aux,marcas[i]);
strcpy(marcas[i],marca);
strcpy(marca,aux);
i++;
}
}
printf("%s tiene que ir en la posicion %d\n", marca, i);
strcpy(marcas[i],marca);
cont++;
for(i=0;i<cont;i++)
printf("%s\n", marcas[i]);
printf("La marca ingresada última a la lista:%s\n", marca);
}
for(i=0;i<7;i++)
printf("%s\n", marcas[i]);
}
3条答案
按热度按时间ki0zmccv1#
这份声明
调用undefined行为,至少是因为它试图更改指针
marca
所指向的字符串文字你需要声明一个字符数组,你将在其中读取一个字符串。
在调用
strcpy
时使用的指针aux
也存在同样的问题以及数组
marcas
的元素所指向的其他字符串文字。SO声明一个由字符串初始化的二维数组,而不是指针数组。举个例子
请注意,任何更改字符串文字的尝试都会导致未定义的行为。
9njqaruj2#
你的程序包含了很多segfaults,这是因为c没有像其他编程语言那样内置可变长度的字符串。这可能会导致尝试“溢出”字符串时出现问题。
在这一行中,你定义了一个指针(marca和aux),每个指针指向一个字符,所以当你调用这一行时:
您正在从命令行阅读可能很大的文本块,并试图将其全部放入一个字符的空间中。这对程序来说是不好的,如果不处理可能会导致Buffer Overflows等漏洞。C是一种本质上不安全的语言,我建议在尝试使用指针之前先了解一下你在做什么。更好的解决方案可能是这样的:
总之,最好的行动方针是正确地学习C。
wi3ka0sx3#
对于其他答案的另一个注意事项是,您可以使用
fgets
而不是scanf
。fgets
的好处是可以限制从用户读取的字符数。所以你不用
做了
上面的
fgets
调用将只读取用户输入的前128个字符(或者您选择的任何数字),而不管用户实际输入了多少个字符。这将防止缓冲区溢出。