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