这是捕获字符串的函数:
void capture(char string[]) {
printf("_____________________________________________________________\n\n");
printf("Ingrese una cadena: ");
scanf(" %[^\n]s", string);
printf("Cadena capturada: %s\n", string);
printf("_____________________________________________________________\n\n");
}
这是在主函数中被调用的函数:
void sort(char string[]) {
int opt, i, j, temp = 0;
char string_copy[50];
strcpy(string_copy, string);
for (i = 0; string_copy[i] != '\0'; i++)
for (i = 0; string_copy[i] != '\0'; i++) {
for (j = i + 1; string_copy[j] != '\0'; j++) {
if (string_copy[i] > string_copy[j]) {
temp = string_copy[i];
string_copy[i] = string_copy[j];
string_copy[j] = temp;
}
}
}
printf("_____________________________________________________________\n\n");
printf("Ordenar de modo:\n1) Ascendente\n2) Descendente\n");
printf("Seleccione una opcion: ");
fflush(stdin);
scanf(" %d", &opt);
switch(opt) {
case 1:
printf("'%s' ordenado de forma ascendente: %s\n", string, string_copy);
break;
case 2:
printf("'%s' ordenado de forma descendente: ", string);
for (i=strlen(string); i != 0; i--)
printf("%c", string_copy[i]);
printf("\n");
break;
default: printf("[ ! ] Selección incorrecta!\n"); break;
}
printf("_____________________________________________________________\n\n");
}
//Imprimir la última palabra de la cadena
void last_word(char string[50]) {
printf("_____________________________________________________________\n\n");
int i, count = 0;
for (i=0; string[i] != '\0'; i++) {
if (string[i] == ' ') {
count = i;
}
}
if (count == 0) {
printf("Solamente hay una palabra: %s\n", string);
} else {
printf("La última palabra en '%s' es: ", string);
for (i=count; string[i] != '\0'; i++) {
printf("%c", string[i]);
}
printf("\n");
}
printf("_____________________________________________________________\n\n");
}
这是有问题的代码:
int main() {
int opc = 0;
char string[50];
do {
printf("MENU:\n");
printf("1) Capturar cadena\n");
printf("2) Sustituir un caracter por otro\n");
printf("3) Buscar un caracter e imprimir el número de veces que aparece\n");
printf("4) Buscar un caracter para eliminar de la cadena.\n");
printf("5) Ordenar los caracteres alfabéticamente\n");
printf("6) Imprimir la última palabra de la cadena\n");
printf("0) Salir\n");
printf("Seleccione una opcion: ");
scanf("%i", &opc);
printf("Opcion: %d", opc);
switch(opc) {
case 1:{
capture(string);
break;
}
case 2:{
replace(string);
break;
}
case 3:{
num_char(string);
break;
}
case 4:{
delete(string);
break;
}
case 5:{
sort(string);
break;
}
case 6:{
last_word(string);
break;
}
case 0:{
printf("Bye\n");
break;
}
default: {
printf("[ ! ] Selección incorrecta!\n");
}
}
} while (opc != 0);
return 0;
}
在切换情况下,上述选项五有问题:仅当捕获的字符串没有空格时才执行。例如,如果您输入“ Hello world”。情况5将永远不会执行,并且scanf
printf("Seleccione una opcion: ");
scanf("%i", &opc);
将只呆在那里等待输入。我重复一次,只有在捕获的字符串中有空格 AND 且您在切换情况下选择选项 5 时,才会发生这种情况。
答案 0 :(得分:1)
capture(&string[50]);
您正在向capture
传递string[50]
的地址。但是没有string[50]
。因此,您正在将地址从string
末尾传递到capture
。 (由于string
有五十个条目,而0
是第一个条目,49
是最后一个条目。没有string[50]
,它已经超出了数组的末尾。
void capture(char string[50]) {
printf("_____________________________________________________________\n\n");
printf("Ingrese una cadena: ");
scanf(" %[^\n]s", string);
printf("Cadena capturada: %s\n", string);
printf("_____________________________________________________________\n\n");
}
糟糕,capture
写到string
过去的地址,但这已经超过了您分配的数组的末尾。在分配的界限之外写入内存可能会破坏其他变量,并导致不可预测的结果。在修复超出范围的写入之前,您实际上无法调试程序中的其他任何内容。您可以使用valgrind
或类似的工具来帮助检测这类错误。
答案 1 :(得分:0)
我试图了解您的逻辑,似乎那里存在问题:
为什么要将string [50]传递给每个函数?我假设您想在每个函数中使用相同的字符串变量,因此,有两点需要您检查:
您应该要求用户在switch()语句之前输入字符串值-例如,在switch()行之前的行中调用capture()。否则,用户可以在进入“捕获”功能之前输入其他菜单选项,并且在这种情况下,该字符串将不存在,从而导致分段错误-如果我没有记错的话。 (您是否尝试过?例如,在选择选项1之前选择了选项3?它一定不起作用)
要通过参数传递“ string”变量,请使用“ string”,而不是“ string [50]”。 在声明之后(其中“ 50”是字符串的大小),表达式“ string [50]”表示该字符串的第50个值,该值甚至不存在,正如David的答案中指出的那样。
< / li>