首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在输入带空格的字符串后,Scanf一直在等待输入?

在输入带空格的字符串后,Scanf一直在等待输入?
EN

Stack Overflow用户
提问于 2018-11-25 19:47:37
回答 2查看 161关注 0票数 0

这是捕获字符串的函数:

代码语言:javascript
运行
复制
void capture(char string[]) {
    printf("_____________________________________________________________\n\n");
    printf("Ingrese una cadena: ");
    scanf(" %[^\n]s", string);
    printf("Cadena capturada: %s\n", string);
    printf("_____________________________________________________________\n\n");
}

这是在主函数中调用的函数:

代码语言:javascript
运行
复制
    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");
}

这就是有问题的代码:

代码语言:javascript
运行
复制
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;
}

问题在于上面选项5在开关的情况下:只有在捕获的字符串没有任何空格时才会执行。例如,如果您输入"Hello“。案例5将永远不会执行,而scanf

代码语言:javascript
运行
复制
printf("Seleccione una opcion: ");
scanf("%i", &opc);

只会待在那里等待输入。重复一遍,如果捕获的字符串有空格,则只会发生这种情况,您可以在开关情况下选择选项5。

EN

回答 2

Stack Overflow用户

发布于 2018-11-25 19:55:31

代码语言:javascript
运行
复制
            capture(&string[50]);

您正在向capture传递string[50]的地址。但是没有string[50]。因此,您要将string结束后的一个地址传递给capture。(因为string有50个条目,而0是第一个条目,49是最后一个条目。没有string[50],它已经过了数组的末尾。

代码语言:javascript
运行
复制
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");
}

Ooops,capture将写到它过去用于string的地址,但这已经超过了您分配的数组的末尾。将内存写入您所分配的边界之外,可能会践踏其他变量并导致不可预测的结果。在修复越界写入之前,您实际上无法调试程序中的任何其他内容。您可以使用valgrind或类似工具来帮助检测这类错误。

票数 1
EN

Stack Overflow用户

发布于 2018-11-25 20:22:34

我试着理解你的逻辑,但似乎有一个问题:

为什么要将string50传递给每个函数?我假设您希望在每个函数中使用相同的字符串变量,因此,有两点需要检查:

  1. 例如,您应该要求用户在switch()语句之前输入字符串值--例如,在switch()行之前的行中调用capture()。否则,用户可以在输入"capture“函数之前输入其他菜单选项,在这种情况下,字符串将不存在,从而导致分段错误--如果我没有弄错的话。(你试过了吗?例如,在选择选项1之前选择选项3?它绝不能奏效)
  2. 若要按参数传递"string“变量,请使用"string",而不是"string50”。声明之后(其中"50“是字符串的大小),表达式"string50”表示字符串的50个值,这个值甚至不存在,正如David的答案所指出的那样。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53471243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档