【发布时间】:2016-04-07 04:28:27
【问题描述】:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void displayString (const char *sPtr);
void getString (char *[]);
int determinIfConvert (char);
int main ()
{
char originalString[11] = { 0 };
char convertedString[11];
getString (originalString);
displayString (originalString);
// this loop runs through the "originalString" to check for the char: 'a'
for (int i = 0; i < 11; i++) {
determinIfConvert (originalString[i]);
}
system ("pause");
}
void getString (char *a[]) // this function gets a string
{
printf ("enter 11 char string: \n");
scanf ("%s", a);
}
// this program displays the inputstring
void displayString (const char *sPtr)
{
for (; (*sPtr != '\0'); ++sPtr) {
printf ("%c", *sPtr);
}
}
int determinIfConvert (char *a)
{
if (a == 97) // this is a test condition. The goal is to
// check for all lowercase, but now i'm
// only entering "aaaaa"
{
printf ("Works"); // if it prints multiple"works"
// then i can continue my program
// but it only prints ONE "works" and freezes.
}
}
目前我在main() 中的 For 循环有问题,没有完成。目标是输入一串字符,然后检查小写字符。这将通过函数DeterminIfConvert(char) 完成。但是,当我逐个元素地遍历循环时,它会在第二个元素之后冻结。我的测试数据是“aaaa”,它会打印“aaaa”,所以我知道我的前两个函数工作得很好。我进入循环,它通过第一个元素,打印“作品”然后冻结。 :/
【问题讨论】:
-
在调用任何
scanf()系列函数时: 1) 始终检查返回值(而不是参数值)以确保操作成功。 2) 使用 '%s' 输入格式说明符时,始终包含比输入缓冲区长度小 1 的最大长度修饰符,因此用户不能溢出输入缓冲区,导致未定义的行为并可能导致 seg故障事件.. -
关于这一行:
printf ("enter 11 char string: \n");输入缓冲区只有 11 个字符长,下面的 '%s' 格式说明符将导致 scanf() 始终将 NUL 字节附加到用户输入的任何内容。所以字符串的最大长度只能是10个字符:建议:1)将11改为10 2)将scanf()的调用修改为:if( 1 != scanf ("%10s", a) ) { // handle error } -
检查小写,给定ascii字符,使用
islower() -
关于这一行:
void getString (char *a[])这表示它正在传递一个指向 char 的指针数组。不是你想要的。建议:void getString (char *a) -
这一行:
for (int i = 0; i < 11; i++) {将检查一个太远的数组。建议:for (int i = 0; originalString[i]; i++) {