如何避免在strcmp中与NULL进行比较?

nxowjjhe  于 2023-05-06  发布在  其他
关注(0)|答案(3)|浏览(233)

我特灵着让这个程序工作,但在给了它很多转,我决定是时候问。无论我做什么,结果总是一个分段错误,我非常确定这是针对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]);
}
ki0zmccv

ki0zmccv1#

这份声明

scanf("%s",marca);

调用undefined行为,至少是因为它试图更改指针marca所指向的字符串文字

marca=" ";

你需要声明一个字符数组,你将在其中读取一个字符串。
在调用strcpy时使用的指针aux也存在同样的问题

strcpy(aux,marcas[i]);

以及数组marcas的元素所指向的其他字符串文字。SO声明一个由字符串初始化的二维数组,而不是指针数组。
举个例子

char marcas[7][12] = {"Alfa Romeo", "Fiat", "Ford", "Lancia", "Renaudl", };

请注意,任何更改字符串文字的尝试都会导致未定义的行为。

9njqaruj

9njqaruj2#

你的程序包含了很多segfaults,这是因为c没有像其他编程语言那样内置可变长度的字符串。这可能会导致尝试“溢出”字符串时出现问题。

char *marca, *aux;

在这一行中,你定义了一个指针(marca和aux),每个指针指向一个字符,所以当你调用这一行时:

scanf("%s",marca);

您正在从命令行阅读可能很大的文本块,并试图将其全部放入一个字符的空间中。这对程序来说是不好的,如果不处理可能会导致Buffer Overflows等漏洞。C是一种本质上不安全的语言,我建议在尝试使用指针之前先了解一下你在做什么。更好的解决方案可能是这样的:

// Create a list of characters (a string) 128 spaces long called marca, and initialize it.
char marca[128] = {'\0'};
char aux[128] = {'\0'};

总之,最好的行动方针是正确地学习C。

wi3ka0sx

wi3ka0sx3#

对于其他答案的另一个注意事项是,您可以使用fgets而不是scanffgets的好处是可以限制从用户读取的字符数。
所以你不用

scanf("%s", marca);

做了

fgets(marca, 128 /*or whatever number you choose*/, stdin);

上面的fgets调用将只读取用户输入的前128个字符(或者您选择的任何数字),而不管用户实际输入了多少个字符。这将防止缓冲区溢出。

相关问题