Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C字符串中的空格?_C - Fatal编程技术网

C字符串中的空格?

C字符串中的空格?,c,C,我在学习C语言编程时遇到了一个问题。我正在创建一个程序,将文本翻译成“rövarspråket”(理解我的问题不需要理解它是什么)。如果我只插入一个单词,程序运行得很好,但是当我添加一个空格时,它就停止生成输出。下面是一个例子: 如果我插入“helloworld”,我希望输出是“hohelollowowoworolloldod”,但它会输出“hohelolloldo”♀". 代码如下: int main(){ char inputText[100], outputText[300];

我在学习C语言编程时遇到了一个问题。我正在创建一个程序,将文本翻译成“rövarspråket”(理解我的问题不需要理解它是什么)。如果我只插入一个单词,程序运行得很好,但是当我添加一个空格时,它就停止生成输出。下面是一个例子:

如果我插入“helloworld”,我希望输出是“hohelollowowoworolloldod”,但它会输出“hohelolloldo”♀". 代码如下:

int main(){

    char inputText[100], outputText[300];
    int inputLength, ipTextNum, opTextNum;

    scanf("%s", &inputText);
    inputLength = strlen(inputText);

    for(ipTextNum = 0; ipTextNum < inputLength; ipTextNum++){

        if(inputText[ipTextNum] == 'a' || inputText[ipTextNum] == 'e' || inputText[ipTextNum] == 'i' || inputText[ipTextNum] == 'o' || inputText[ipTextNum] == 'u' || inputText[ipTextNum] == 'y' || inputText[ipTextNum] == 'å' || inputText[ipTextNum] == 'ä' || inputText[ipTextNum] == 'ö'){
            outputText[opTextNum] = inputText[ipTextNum];
            opTextNum++;    
        }

        else {
            outputText[opTextNum] = inputText[ipTextNum];
            outputText[opTextNum+1] = 'o';
            outputText[opTextNum+2] = inputText[ipTextNum];
            opTextNum += 3; 
        }
    }

    printf("%s", outputText);


    return 0;
}
intmain(){
字符输入文本[100],输出文本[300];
int inputLength、ipTextNum、opTextNum;
scanf(“%s”、&inputText);
inputLength=strlen(inputText);
for(ipTextNum=0;ipTextNum
如果我还将inputText[ipTextNum]==''添加到If语句中,它将输出与前面相同的内容,但没有♀. 有人知道问题出在哪里吗?我试着打印输入,但似乎所有的文本都在空白处终止。字符串中是否允许空白,如果不允许,我该如何解决这个问题?

问题如下:

scanf("%s", &inputText);
实际上有两个问题..您希望它读取我假设的整行,因此我们不使用%s,我们使用“除\n以外的所有字符”,然后读取\n。另一个问题是&inputText

scanf("%s", inputText);
应该是这样的……但这增加了整条线

scanf("%[^\n]\n", inputText);
继续进行分析,只要不溢出!

问题在这里:

scanf("%s", &inputText);
实际上有两个问题..您希望它读取我假设的整行,因此我们不使用%s,我们使用“除\n以外的所有字符”,然后读取\n。另一个问题是&inputText

scanf("%s", inputText);
应该是这样的……但这增加了整条线

scanf("%[^\n]\n", inputText);

继续进行解析,只要不溢出!

scanf
确实不应该用于带空格的字符串,因为它不接受空格。你应该真正使用
fgets
。有关更多信息,请参阅此答案:

下面是一个示例(来自上述答案)来说明
fgets
的工作原理:

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

/* Maximum name size + 1. */
#define MAX_NAME_SZ 256

int main(int argC, char *argV[]) {
    /* Allocate memory and check if okay. */
    char *name = malloc (MAX_NAME_SZ);
    if (name == NULL) {
        printf ("No memory\n");
        return 1;
    }

    /* Ask user for name. */
    printf("What is your name? ");

    /* Get the name, with size limit. */
    fgets (name, MAX_NAME_SZ, stdin);

    /* Remove trailing newline, if there. */
    if ((strlen(name)>0) && (name[strlen (name) - 1] == '\n'))
        name[strlen (name) - 1] = '\0';

    /* Say hello. */
    printf("Hello %s. Nice to meet you.\n", name);

    /* Free memory and exit. */
    free (name);
    return 0;
}
#包括
#包括
#包括
/*最大名称大小+1*/
#定义MAX_NAME_SZ 256
int main(int argC,char*argV[]){
/*分配内存并检查是否正常*/
char*name=malloc(MAX_name_SZ);
if(name==NULL){
printf(“无内存”);
返回1;
}
/*询问用户姓名*/
printf(“你叫什么名字?”);
/*获取具有大小限制的名称*/
fgets(名称、最大名称、标准名称);
/*删除尾部换行符(如果有)*/
如果((strlen(name)>0)和&(name[strlen(name)-1]=='\n'))
名称[strlen(name)-1]='\0';
/*打个招呼*/
printf(“你好%s,很高兴认识你。\n”,name);
/*释放内存并退出*/
免费(姓名);
返回0;
}

scanf
确实不应该用于带空格的字符串,因为它不接受空格。您应该真正使用
fgets
。有关详细信息,请参阅此答案:

下面是一个示例(来自上述答案)来说明
fgets
的工作原理:

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

/* Maximum name size + 1. */
#define MAX_NAME_SZ 256

int main(int argC, char *argV[]) {
    /* Allocate memory and check if okay. */
    char *name = malloc (MAX_NAME_SZ);
    if (name == NULL) {
        printf ("No memory\n");
        return 1;
    }

    /* Ask user for name. */
    printf("What is your name? ");

    /* Get the name, with size limit. */
    fgets (name, MAX_NAME_SZ, stdin);

    /* Remove trailing newline, if there. */
    if ((strlen(name)>0) && (name[strlen (name) - 1] == '\n'))
        name[strlen (name) - 1] = '\0';

    /* Say hello. */
    printf("Hello %s. Nice to meet you.\n", name);

    /* Free memory and exit. */
    free (name);
    return 0;
}
#包括
#包括
#包括
/*最大名称大小+1*/
#定义MAX_NAME_SZ 256
int main(int argC,char*argV[]){
/*分配内存并检查是否正常*/
char*name=malloc(MAX_name_SZ);
if(name==NULL){
printf(“无内存”);
返回1;
}
/*询问用户姓名*/
printf(“你叫什么名字?”);
/*获取具有大小限制的名称*/
fgets(名称、最大名称、标准名称);
/*删除尾部换行符(如果有)*/
如果((strlen(name)>0)和&(name[strlen(name)-1]=='\n'))
名称[strlen(name)-1]='\0';
/*打个招呼*/
printf(“你好%s,很高兴认识你。\n”,name);
/*释放内存并退出*/
免费(姓名);
返回0;
}

以及确保输入不会像其他海报所指出的那样溢出缓冲区;另一个主要问题是您永远不会空终止输出

printf(“%s”
知道何时停止输出字符,因为它遇到了空字节。但是您从未在输出的末尾写入空字节,这解释了为什么在它之后有一个垃圾字符(然后您碰巧在垃圾之后的缓冲区中有一个空字节)

在循环之后,在
printf
之前添加
outputText[opTextNum]=0;


当然,您还需要确保循环始终在
opTextNum
为真时停止。由于
input
具有最大字符串长度
99
,那么可以写入的最大输出是
3*99+1
,因此您现在是安全的。如果您决定稍后更改算法,则需要进行精简尽管如此,我还是要再次强调这一点。

并确保输入不会像其他海报所指出的那样溢出缓冲区;另一个主要问题是,您永远不会使用null终止输出

printf(“%s”
知道何时停止输出字符,因为它遇到了空字节。但是您从未在输出的末尾写入空字节,这解释了为什么在它之后有一个垃圾字符(然后您碰巧在垃圾之后的缓冲区中有一个空字节)

在循环之后,在前面添加
outputText[opTextNum]=0;
hello world
you entered 
'hello world'
The robber said:
'hohelollolo wowororloldod'